JavaSE_网络编程_UDP_2

利用多线程实现同一窗口下消息的发送和接收


主函数代码:

import java.net.DatagramSocket;
import java.net.SocketException;
public class udp_send_receive {
  public static void main(String[] args) throws SocketException {
    /*方法说明:
     *在同一dos窗口下,实现udp消息发送和接收
     */
    DatagramSocket ds_send=new DatagramSocket();
    DatagramSocket ds_receive=new DatagramSocket(10005);
    new Thread(new UDP_Send(ds_send)).start();
    new Thread(new UDP_Receive(ds_receive)).start();
    /*
     * 新建类:UDP_Send和UDP_Receive实现Runnable接口,
     * 覆写run()方法,成员变量:DatagramSocket
     */
  }
}



发送端代码:


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDP_Send implements Runnable {
  private DatagramSocket ds;
  public UDP_Send(DatagramSocket ds) {
    super();
    this.ds = ds;
  }
  public void run() {
    /*方法说明:
     *将前面的发送端代码放到这儿!
     *"127.0.0.1"换成192.168.1.255就是给整个局域网发广播
     */
    try {
      System.out.println("发送端active....");
      BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
      String line = null;
      while((line=bufr.readLine())!=null){
        byte[] buf = line.getBytes();
        DatagramPacket dp = 
          new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10005);
        ds.send(dp);
        if("886".equals(line))
          break;
        }
      ds.close();
    } catch (Exception e) {    }
  }
}



接收端代码:


import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDP_Receive implements Runnable {
  private DatagramSocket ds;
  public UDP_Receive(DatagramSocket ds) {
    super();
    this.ds = ds;
  }
  public void run() {
    /*方法说明:
     *DatagramSocket ds已经在外部绑定了10005端口号!
     */
    try {
      while(true){
        //2,创建数据包。
        byte[] buf = new byte[1024];
        DatagramPacket dp = new DatagramPacket(buf,buf.length);
        //3,使用接收方法将数据存储到数据包中。
        ds.receive(dp);//阻塞式的。与while(true)对立
        //4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。
        String ip = dp.getAddress().getHostAddress();
        int port = dp.getPort();
        String text = new String(dp.getData(),0,dp.getLength());
        System.out.println(ip+":"+port+":"+text);
      }    
    } catch (Exception e) {    }
  }

}



你可能感兴趣的:(java,多线程,网络编程,UDP)