TCP是面向Stream,UDP是面向Packet的理解

今天在讨论一个问题的时候,一个同事说TCP会对应用层提供的包提供分拆功能。看来好多同学还不是很理解TCP是面向Stream是什么意思


结论:

1.     UDP是面向Packet,客户端应用层传给UDP一个Packet,即使该PacketIP层被fragement,服务端UDP层也会还原出一个应用层的Packet

2.     TCP是面向Stream,客户端应用层传给TCP一个Packet,该Packet会放到TCPBuffer中,客户端有可能1TCP包发送一个字节,也有可能1TCP包发送应用层多个包,服务端TCP层不会还原出一个应用层的Packet


编程要求:

1. 编写UDP应用层代码比较简单,应用层收到的就是完整Packet

2. 编写TCP应用层代码比较复杂,如果1Packet多个TCP传过来,应用层需要去拼出一个完整包;如果多个Packet 1TCP传过来,应用层剥离出多个Packet;如果1TCP包含1个完整Packet1个不完整Packet,应用层剥离出1个完整Packet以后,需要缓存住剩下的内容,等待后面的内容组成下一个完整Packet


TCP Server代码:

importjava.io.IOException;

importjava.net.InetSocketAddress;

importjava.nio.ByteBuffer;

importjava.nio.channels.ServerSocketChannel;

importjava.nio.channels.SocketChannel;


public classTCPServer

{

        private static final int BUFFER_SIZE = 3000;

        

        public static void main(String[] args) throws IOException, InterruptedException

        {

                 ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);

                 

                 ServerSocketChannel ssc = ServerSocketChannel.open( );

                 ssc.socket().bind(new InetSocketAddress(8888));

                 while(true)

                 {

                         SocketChannel sc = ssc.accept();

                         if(sc == null)

                         {

                                  Thread.sleep(1000);

                         }

                         else

                         {

                                  int i = 0;

                                  buffer.clear();

                                  while(sc.read(buffer) != 0)

                                  {

                                           i++;

                                           

                                           buffer.flip();

                                           System.out.println("Server receives message:" + i + "(" +buffer.limit() + "Bytes)");

                                  }

                                  

                                  sc.close();

                                  System.out.println("Connection closed");

                         }

                 }

        }

}


TCP Client代码:




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值