一个UDP(多播)局域聊天的简单实现 (JAVA)

来源:互联网 发布:新公司搜索引擎优化 编辑:程序博客网 时间:2024/06/08 19:37


多播类:

/**
 *  程序名称:Broadcast.java
 *  程序作用:创建一个多播类,用于数据的发送与接收
 *  程序作者:J.J.Y
 *
 */

 import java.io.*; import java.net.*;  public class Broadcast {  //定义播段地址,接收端口,发送端口  public static final String BroadcastGroup = "228.6.7.8";  public static final int BroadcastRecvPort = 4567;  public static final int BroadcastSendPort = 4566;    //接收字符串  private String Message;  //接收包和发送包  private DatagramPacket DataSendPacket;  private DatagramPacket DataRecvPacket;  //private DatagramSocket SendSocket;  //接收缓冲区和发送缓冲区  private byte[] SendBuf = new byte[1024];   private byte[] RecvBuf = new byte[1024];  //发送Socket  private DatagramSocket SendSocket;  //多播类  MulticastSocket BroadcastClass;  //构造函数  public Broadcast()  {   try   {       //发送Socket初始化       SendSocket = new DatagramSocket();       //多播段初始化       BroadcastClass = new MulticastSocket(BroadcastRecvPort);       //确定多报播地址       BroadcastClass.joinGroup(InetAddress.getByName(BroadcastGroup));   }   catch(IOException e)   {    e.printStackTrace();   }  }    //发送数据  public void SendData(String InMsg)  {   try   {       //发送数据包初始化       SendBuf = InMsg.getBytes();       int length = InMsg.getBytes().length;       DataSendPacket = new DatagramPacket(SendBuf,length,InetAddress.getByName(BroadcastGroup),BroadcastRecvPort);         //数据发送          SendSocket.send(DataSendPacket);        }        catch(IOException ioe)        {         ioe.printStackTrace();        }  }    //接收数据并返回  public String GetData()  {   try   {       //接收数据并送与接收缓冲区       DataRecvPacket = new DatagramPacket(RecvBuf,1024);        BroadcastClass.receive(DataRecvPacket);       //取得数据并返回数据       Message = new String(DataRecvPacket.getData(),0,DataRecvPacket.getLength());       Message = Message + " from " + DataRecvPacket.getAddress().getHostName();       Message = Message + " 端口 " + DataRecvPacket.getPort();      }      catch (IOException ioe)      {       ioe.printStackTrace();      }      return Message;  } }


/**一个接收线程,主要用于接收数据,随便也写了发送数据
 *   程序名称:Receiver.java
 *   程序作用:接收线程类
 *   程序作者:J.J.Y
 */
 
 

import java.net.*; import java.io.*; import javax.swing.*;  public class Receiver extends Thread {  //接收的信息  private String Message;  private JTextArea displayArea;  Broadcast Recv = new Broadcast();  //构造函数,    public Receiver(JTextArea RecvArea)    {     displayArea = RecvArea;     }        public void run()    {     while (true)     {      //监听接收数据包      Message = Recv.GetData();      //System.out.println(Message);      //displayArea.setText("11111");      displayArea.append(Message + "\r\n");     }     }        //发送数据    public void SendMessage(String InMsg)    {     Recv.SendData(InMsg);    } }/** *   程序名称:ChatClient.java *   程序作用:UDP聊天客户端 *   程序作者:J.J.Y */  import javax.swing.*; import java.awt.*; import java.awt.event.*;  public class ChatClient extends JFrame implements ActionListener {  //接收线程  Receiver recv;  //发送文本框  JTextField Sendtxt;    public ChatClient()  {        //客户端界面简单初始化        Sendtxt = new JTextField();        Sendtxt.addActionListener(this);        JTextArea DisplayArea = new JTextArea();         JScrollPane js =new JScrollPane();         JViewport port = js.getViewport();      port.add(DisplayArea);        // System.out.println(js.getLayout());        //js.add(DisplayArea);         this.getContentPane().add(BorderLayout.CENTER,js);        this.getContentPane().add(BorderLayout.SOUTH,Sendtxt);        this.setSize(300,300);        this.show();        //Broadcast brd = new Broadcast();        //brd.SendData("客户端初始化");        //创建一个新的接收线程并运行        recv = new Receiver(DisplayArea);        recv.start();   }    //事件响应代码  public void actionPerformed(ActionEvent e)  {   //文本框有内容才发送数据   if (Sendtxt.getText().length() != 0)   {    recv.SendMessage(Sendtxt.getText());   }  }    public static void main(String args[])  {   new ChatClient();  } }




转载地址:http://www.360doc.com/content/07/1006/15/11586_792012.shtml

原创粉丝点击