今天在讨论一个问题的时候,一个同事说TCP会对应用层提供的包提供分拆功能。看来好多同学还不是很理解TCP是面向Stream是什么意思
结论:
1. UDP是面向Packet,客户端应用层传给UDP一个Packet,即使该Packet在IP层被fragement,服务端UDP层也会还原出一个应用层的Packet
2. TCP是面向Stream,客户端应用层传给TCP一个Packet,该Packet会放到TCP的Buffer中,客户端有可能1个TCP包发送一个字节,也有可能1个TCP包发送应用层多个包,服务端TCP层不会还原出一个应用层的Packet
编程要求:
1. 编写UDP应用层代码比较简单,应用层收到的就是完整Packet
2. 编写TCP应用层代码比较复杂,如果1个Packet多个TCP传过来,应用层需要去拼出一个完整包;如果多个Packet 1个TCP传过来,应用层剥离出多个Packet;如果1个TCP包含1个完整Packet和1个不完整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代码: