通过套接字(socket)和UDP协议实现网络通信

9/6/2015来源:Java教程人气:1694

通过套接字(socket)和UDP协议实现网络通信 2015-01-29 16:15 by YouxiBug, ... 阅读, ... 评论, 收藏, 编辑

UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。(无连接、封包、大小限制、速度快)。

一、UDP协议的特点:

  1. 将数据及源和目的地封装成数据包中,不需要建立连接。
  2. 每个数据报的大小限制在64K内
  3. 因无连接,是不可靠协议。
  4. 不需要建立连接,速度快。

二、通俗解释:

面向无连接的,你在与不在我都在发。就像邮局寄包裹,比如寄饼干。,邮局会给你一个盒子和胶带,你将饼干封上(封包),将数据达成数据包,打完之后,贴张地址(天堂街)、门牌号(地狱门18号)(地址、端口),但地址可能不存在,那么则丢弃。

三、UDP举例:

  步话机、FEIQ、网络会议、录屏传播、聊天。

四、socket(套接字):

Socket就是为网络服务提供的一种机制。通信的两端都有Socket。(插座,初期可简单理解为应用程序,而非网卡接口)网络通信其实就是Socket通信。数据在两个Socket间通过IO传输。

五、发送端:

需求:通过Udp传输的方式,将一段文字数据发送出去。定义了一个udp的接收端。思路:1、建立udpSocket服务(找邮局)2、提供数据,将数据封装到数据包中(封包、写地址)3、通过socket服务发送功能,将数据包发送出去。(包裹上路)4、关闭资源。

 1 class UdpSend  2 { 3     public static void main(String[] args) throws Exception 4     { 5         //1、创建udpSocket服务。通过DatagramSocket对象 6         DatagramSocket ds=new DatagramSocket(8888); 7  8         //2、确定数据,并封装数据包 9         byte[] buf="udp I coming".getBytes();10         11         /*12         InetAddress addr=InetAddress.getLocalHost();13         InetAddress addr = InetAddress.getByName(null);14         InetAddress.getByName("localhost");15         InetAddress.getByName("127.0.0.1");16         */17         DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.102"),10000);18 19         //3、通过socket服务,将已有的数据包发送出去,通过send方法20         ds.send(dp);21 22         //4、关闭资源23         ds.close();24     }25 }
发送端程序代码(class UdpSend )

六、接收端:

需求:定义一个应用程序,用于接收udp协议传输的数据并处理定义udp的接收端。思路:1、定义udpSocket服务。通常会监听一个端口。其实就是给这个接收网络应用程序定义一个数字标识,方便于明确哪些数据过来,该应用程序可以处理。2、定义一个数据包。因为要存储接收到的字节数据。数据包对象中有更多功能可以提取字节数据中的不同数据信息。3、通过socket服务端额receive方法将收到的数据存入已定义的数据包中4、通过手机开那片对象的特有功能,将这些不同数据取出打印在控制台上。5、关闭资源

 1 class UdPReceive 2 { 3     public static void main(String[] agrs) throws Exception 4     { 5         //1、创建udpsocket,建立端点 6         DatagramSocket ds=new DatagramSocket(10000); 7  8         //2、定义数据包,用于存储数据 9         byte[] buf=new byte[1024];10         DatagramPacket dp=new DatagramPacket(buf,buf.length);11 12         //3、通过receive方法将收到的数据存到数据包 中13         ds.receive(dp);//阻塞式方法,线程机制,wait了14 15         //通过数据包的方法获取其中的数据16         String ip=dp.getAddress().getHostAddress();//获取发送端IP地址17         String data=new String(dp.getData(),0,dp.getLength());//获取数据18         int port=dp.getPort();//获取发送端端口19 20         System.out.println(ip+"::"+data+"::"+port);//信息打印控制台21     22         //5、关闭资源23         ds.close();24     }25 }
接收端程序代码(class UdpReceive)

运行截图:

  

七、在接收者与发送者之间的改进

承接UdpDemo.java,实现只能一个人发,一个人收。1、实现键盘录入:2、实现连续输入(while)

 1 import java.net.*; 2 import java.io.*; 3  4 class UdpSend2  5 { 6     public static void main(String[] args) throws Exception 7     { 8         DatagramSocket ds=new DatagramSocket(); 9 10         //实现键盘录入11         BufferedReader bufr=12             new BufferedReader(new InputStreamReader(System.in));13         String line=null;14 15         while ((line=bufr.readLine())!=null)16         {17             if ("886".equals(line))18                 break;19             byte[] buf=line.getBytes();20             21             //IP地址,暂且用本机IP地址,也可用广播地址192.168.1.25522             DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.102"),10001);23             24             ds.send(dp);25         }26         ds.close();27     }28 }29 30 31 class UdpReceive232 {33     public static void main(String[] agrs) throws Exception34     {35         DatagramSocket ds=new DatagramSocket(10001);36 37         byte[] buf=new byte[1024];38         DatagramPacket dp=new DatagramPacket(buf,buf.length);39 40         while (true)41         {42             ds.receive(dp);//阻塞式方法,线程机制,wait了43 44             String ip=dp.getAddress().getHostAddress();//获取发送端IP地址45             String data=new String(dp.getData(),0,dp.getLength());//获取数据46             int port=dp.getPort();//获取发送端端口47 48             System.out.println(ip+"::"+data+"::"+port);//信息打印控制台49         }50         51         //ds.close();服务器一般不关,也有种方法,while判断条件关52     }53 }
发送端+接收端Code

  运行截图: