黑马程序员技术交流社区

标题: UDP 发送接受消息 [打印本页]

作者: fmi110    时间: 2015-8-11 17:00
标题: UDP 发送接受消息
UDP
  1. /*
  2. UDP:User Datagram protocol 用户数据报协议
  3.         特点:将数据和源和目的封装成数据包,不需要建立连接
  4.                         每个数据的大小限制在64k
  5.                         不需要建立连接,速度快
  6.                         是不可靠传输协议

  7. Socket:
  8.         Socket就是为网络服务提供的一种机制。通信的两端都有Socket.
  9.         网络通信其实就是两个Socket建的通信,数据在两个Socket间通过IO传输

  10. UDP传输:
  11.         DatagramSocket(用来发送和接收数据包的套接字)
  12.         DatagramPacket(数据报包)
  13.        
  14.         流程:
  15.                 1 建立udp的socket服务
  16.                 2 将发送数据封装至DatagramPacket
  17.                 3 通过udp的Socket服务将包发送出去
  18.                 4 关闭服务

  19. */
  20. /*
  21. DatagramSocket:
  22.         构造方法:
  23.                 DatagramSocket(int port); 绑定本地端口
  24.                 DatagramSocket(int port,InetAddress addr); 绑定本地端口 和 本地ip 地址
  25.                 DatagramSocket(SocketAddress addr); 绑定本地SocketAddress地址(ip地址和端口)

  26.                         InetSocketAddress(InetAddress addr, int port);根据 IP 地址和端口号创建套接字地址

  27.         方法:
  28.                 bind(SocketAddress addr); //绑定地址和端口
  29.                 close();
  30.                 connect(InetAddress addr,int port);
  31.                 connect(SocketAddress addr);
  32.                 disconnect(); //断开连接

  33.                 boolean isBound(); 是否绑定
  34.                 boolean isClose();
  35.                 boolean isConnected();

  36.                 receive(DatagramPacket p); 从此套接字接收数据包
  37.                 send(DatagramPacket p); 从此套接字发送数据包

  38. DatagramPacket
  39.         构造函数:
  40.                 DatagramPacket(byte[] buf, int length)
  41.                         构造 DatagramPacket,用来接收长度为 length 的数据包
  42.                 DatagramPacket(byte[] buf,int offset,int len,InetAddress addr,int port);
  43.                         构造数据包,长度为len,目的主机时 addr ,端口号是 port
  44.                 DatagramPacket(byte[] buf,int offset,int len,SocketAddress saddr);
  45.                         构造数据包,长度为len,目的主机时 saddr
  46.        
  47.         方法:
  48.                 InetAddress getAddress();

  49.                 byte[] getData(); 返回数据包内的数据
  50.                 void   setData(byte[] buf); 设置数据包的数据信息
  51.                
  52.                 int getPort(); 返回远程主机的端口号
  53.                 setAddress();
  54.                 setPort();
  55.                 setSocketAddress();               
  56. */
  57. import java.net.*;
  58. class UdpSendDemo
  59. {
  60.         public static void main(String[] args) throws Exception
  61.         {
  62.                 //1 建立DatagramSocket,并指定端口
  63.                 DatagramSocket dss = new DatagramSocket(9999);

  64.                 //2 建立数据包,并将发送数据装包
  65.                 String msg = "我是发送包,叮叮叮。。。";
  66.                 byte[] buf = msg.getBytes();
  67.                 DatagramPacket dp =
  68.                                 new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.31.248"),10000);

  69.                 //3 发送数据包
  70. //                dss.send(dp);
  71. //                buf = ("发送数据的长度:"+buf.length).getBytes();
  72. //                dp.setData(buf,0,buf.length);
  73.                 dss.send(dp);

  74.                 //4 关闭服务
  75.                 dss.close();
  76.                 System.out.println("Hello World!");
  77.         }
  78. }


  79. class UdpReceiveDemo
  80. {
  81.         public static void main(String[] args) throws Exception
  82.         {
  83.                 DatagramSocket ds = new DatagramSocket(10000);

  84.                 byte[] buf = new byte[1024];
  85.                
  86.                 DatagramPacket dp = new DatagramPacket(buf,buf.length);

  87.                 ds.receive(dp);//阻塞式

  88.                 String ip = dp.getAddress().getHostAddress(); //获取发送包的主机的地址
  89.                 String name = dp.getAddress().getHostName();//获取远端主机名
  90.                 int port = dp.getPort();
  91.                 int len = dp.getLength();//获取接受到的数据的长度

  92.                 byte[] buf1 = dp.getData();//获取信息
  93.                 System.out.println("自动创建的缓冲数组的长度:"+buf1.length);
  94.                 String msg = new String(buf,0,dp.getLength());
  95.                 System.out.println("远端主机:"+name+": "+ip+" :"+msg+" port: "+port+" length: "+len);
  96.                 ds.close();
  97.         }
  98. }
复制代码







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2