黑马程序员技术交流社区

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

作者: 淡忘初学者    时间: 2015-8-24 11:39
标题: 网络编程基础之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();//关闭资源
              }
      }
      TCP代码如下:
      class TcpClient {
              public static void main(String[] args)throws Exception{//为了防止出现传输异常,先在主函数抛出异常
                     Socket s=new Socket("192.168.1.105",8002);//创建TCP服务,并指定IP和端口
                     InputStream in=s.getInputStream();//获取Socket的输入流,接收服务端反馈的数据
                     byte[] buf=new byte[1024];
                     int leng=in.read(buf);
                     System.out.println(new String(buf,0,leng));//拆包,进行资源读取
                     s.close();//关闭资源
              }
      }
      class TcpServer{
              public static void main(String[] args)throws Exception{//为了防止出现传输异常,先在主函数抛出异常
                     ServerSocket ss=new ServerSocket(8002);//创建TCP服务,指定接收端口
                     Socket s=ss.accept();//接收客户端请求,并将其传输给服务端Socket对象
                    OutputStream out=s.getOutputStream();//获取服务端Socket输出流
                    System.out.println("开始与客户连接");
                    out.write("hello world".getBytes());//封包输出
                    System.out.println("结束与客户连接");
                    s.close();//关闭资源
                    ss.close();
              }
       }

作者: pengbeilin    时间: 2015-8-24 13:23
goodgoodgood
作者: 淡忘初学者    时间: 2015-8-25 20:47
pengbeilin 发表于 2015-8-24 13:23
goodgoodgood

谢谢~~~互相加油




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