|
最近学了Java 网络编程,花了2天写时间写了个这个小东东,第一次发,大家不要见笑笑,呵呵! 多播类: /** * 程序名称: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(); } } 在JDK1.4.2测试通过,直接编译ChatClient.java运行。 另外,本人是菜鸟,欢迎高手指点,我的邮箱:jjy_8888@163.com
|