黑马程序员技术交流社区

标题: 网络编程基础之UDP与TCP比较 [打印本页]

作者: hehaiwei    时间: 2016-3-13 16:45
标题: 网络编程基础之UDP与TCP比较
以下内容基于张孝祥老师视频课程笔记:
         UDP和TCP为TCP/IP结构中传输层的两个重要高级协议,所谓协议,是位于同一个网络通信和连接时,需要遵守的规则,这个规则我们称为网络通信协议。目前,国际组织将TCP/IP协议作为通用协议。
         UDP称为无连接的协议,面向无连接,只需将数据及源和目的封装在数据包中,不需要建立连接便可进行传输,因此并不十分可靠。UDP对每个包的大小有限制,每个数据包大小在64k内,传输速度快,但时常容易丢包。通常用来传输音频、视频和普通数据。就好比我们给别人留语言,不需要别人在线我们便可发出,等到对方在线时再确认接收,接收到的语言有时十分模糊,听不清楚,这便是由于传输过程中缺失了一部分数据了。
        而TCP协议面向连接,一端为客户端,一端为服务端,只有连接后,形成数据传输的通道后,两端才能进行数据的传输。因此,建立连接后,传输的数据量大,但效率会比UDP要低(因为建立连接花费了时间)。由于TCP要经历三次握才能建立连接,所以可靠性会比UDP要高,通常用于下载和上传重要数据。TCP的连接过程就好比打电话,客户端先问,服务端你在吗?服务端回话,我在的。客户端再进行服务端的访问。由此经历了三次握手。
       在程序上,两者都需先建立Socket服务,然后进行封包、发包、收包、拆包的过程,最后关闭资源。具体代码如下(应先导入io和net包):
       UDP代码如下:
        class UdpSend{
               public static void main(String[] args)throws Exception{//为了防止出现传输异常,先在主函数抛出异常
                      DatagramSocket ds=new DatagramSocket();//创建UDP服务
                      byte[] buf="hello world".getBytes();
                      DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.105"),8001);//进行数据封包
                      ds.send(dp);//发包
                      ds.close();//关闭资源
               }
         }
        class UdpReceive{
               public static void main(String[] args)throws Exception{//为了防止出现传输异常,先在主函数抛出异常
                      DatagramSocket ds=new DatagramSocket(8001);//创建UDP服务,并传入接收端口
                      byte[] buf=new byte[1024];
                      DatagramPacket dp=new DatagramPacket(buf,buf.length);//①
                      ds.receive(dp);//收包
                      String data=new String(dp.getData(),0,dp.getLength());//①步和本步共同完成拆包工作
                      System.out.println(data);
                      ds.close();//关闭资源




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