A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李双 中级黑马   /  2014-11-23 11:54  /  1279 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

Socket 编程中 TCP/IP,UDP协议区别

3 个回复

倒序浏览
UDP:        (面向无连接)
                不需要建立连接,把源和目的封装在数据包中。

                每个数据包的大小在64K内(所以大的数据分成很多小包发。)

                坏处:因无连接,所以是不可靠协议(可能断开连接了还在发数据,)容易丢失数据。

                好处:不需要连接(不需要对方在),所以传输速度快。
                (应用:如视频连接,视频会议,讲课、聊天、桌面共享等,适合在丢失数据不重要的地方)
                例子:
                        对讲机:不需要知道对方在不在,你只需要在对应的频段上说话。对方收不到,数据就丢失了



TCP:        (面向连接)
        必须建立连接。形成数据通道。

        在连接中进行大数据的传输。

        通过三次握手完成连接(通过三次握手,确定对方是否在),是可靠协议。
                第一次:我--->你        发送数据给你,看看你在不在
                第二次:你--->我        在的话,接收到数据后回应我,说你接收到数据了
                第三次:我--->你        我接收到你回应的数据后回应你,我也接收到你发的数据了
                       
                        三次握手成功后才完成连接通道的建立!
               

        必须建立连接(对方必须在),效率稍低。

        (应用:下载连接等。适合不能丢失数据的地方)
        例子:
                打电话:需要确定对方在不在,要是不在你就不能连接,不能通话。
                        连接完毕,对方挂断后也不能继续连接。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报 1 0
Socket (插座) 套接字 可以理解为数据传输的两端  例如港口
        Socket就是为网络服务提供的一种机制
        通信的两端都有Socket
        网络通信其实就是Socket间的通信
        数据在两个Socket间通过IO传输

UDP传输
        DatagramSocket DatagramPacket
        建立发送端 接收端
        建立数据包
        调用Socket的发送接受方法
        关闭Socket

UDP发送端思路及代码:
//1,udpsocket服务。使用DatagramSocket对象。
                DatagramSocket ds = new DatagramSocket(8888);
//2,将要发送的数据封装到数据包中。
                String str = "udp传输演示:哥们来了!";
                        //使用DatagramPacket将数据封装到的该对象包中。
                byte[] buf = str.getBytes();
                DatagramPacket dp =
                                new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.100"),10000);       
//3,通过udp的socket服务将数据包发送出去。使用send方法。
                ds.send(dp);               
//4,关闭资源。
                ds.close();
UDP接收端思路及代码:
//1,建立udp socket服务。
                DatagramSocket ds = new DatagramSocket(10000);
                //2,创建数据包。
                byte[] buf = new byte[1024];
                DatagramPacket dp = new DatagramPacket(buf,buf.length);               
//3,使用接收方法将数据存储到数据包中。
                ds.receive(dp);//阻塞式的。       
//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);
//5,关闭资源。
ds.close();
TCP传输
        Socket ServerSocket
        建立客户端和服务器端
        建立连接后,通过Socket中的IO流进行数据的传输
        关闭socket

TCP客户端思路及代码:
//1创建客户端socket服务。
                Socket socket = new Socket("192.168.1.100",10002);
//2获取socket流中的输出流。
                OutputStream out = socket.getOutputStream();
//3使用输出流将指定的数据写出去。
                out.write("tcp演示:哥们又来了!".getBytes());
//4关闭资源。
                socket.close();
               
TCP服务端思路及代码:
//1创建服务端对象。
                ServerSocket ss = new ServerSocket(10002);
//2,获取连接过来的客户端对象。
                Socket s = ss.accept();//阻塞式.
                String ip = s.getInetAddress().getHostAddress();
//3,通过socket对象获取输入流,要读取客户端发来的数据
                InputStream in = s.getInputStream();
                byte[] buf = new byte[1024];
                int len = in.read(buf);
                String text = new String(buf,0,len);
                System.out.println(ip+":"+text);               
//4关闭资源。关客户端,关服务端。       
                s.close();
                ss.close();

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 二月的雨 于 2014-11-23 22:31 编辑

从楼主的提问来看,问的是TCP/IP和UDP的协议区别。因此感觉楼主可能有点不太清楚TCP、IP、UDP的关系。 楼主可以简单的这么理解。IP是一种协议,可以理解为寻址协议,用来确认对话双方的位置。通过IP协议寻址之后可以 用TCP或者UDP的方式来进行传输。
TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。提供了无连接的数据报服务;因此具有较好的实时性,工作效率较TCP协议高。
比如QQ,登录时因为交互数据量小而且需要可靠性,因此用TCP协议。 QQ登录之后双方进行会话,用UDP就能满足要求了,这样可以提高效率。平常我们会发现有时候QQ聊天的内容,我们这边发出去了,但是对方没有收到,就是因为用的UDP协议。当然虽然用udp协议,但是QQ还是会在udp协议的基础上自己做些验证操作来保证一定的可靠性。 通过抓包工具我们可以看到QQ用的是OICQ协议,也就是QQ自己定义的协议。
实际开发中,有时候我们需要对原来的协议标准进行一定的扩展,比如飞信的通信协议就是对SIP协议进行了一定扩展来实现传输的。

下边的2张截图分别是 TCP和UDP协议在实际传输中的数据,是通过抓包工具获取的。楼主可以实际感受下。

图1:TCP协议传输内容


图2:UDP协议传输内容


从直观感觉来看,TCP相比较UDP包含了校验信息和标志位等数据,并且TCP还需要3次握手来建立链接,因此TCP可靠性高,但是效率相对UDP要低。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马