您的位置:首页 > 理论基础 > 计算机网络

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

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

一、UDP协议的特点:

将数据及源和目的地封装成数据包中,不需要建立连接。

每个数据报的大小限制在64K内

因无连接,是不可靠协议。

不需要建立连接,速度快。

二、通俗解释:

面向无连接的,你在与不在我都在发。就像邮局寄包裹,比如寄饼干。
,邮局会给你一个盒子和胶带,你将饼干封上(封包),将数据达成数据包,打完之后,贴张地址(天堂街)、门牌号(地狱门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.255
22             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 UdpReceive2
32 {
33     public static void main(String[] agrs) throws Exception
34     {
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
  运行截图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐