TCP套接字与UDP套接字编程

用C++和Java很容易实现socket通信,两者大同小异,注意在尝试换一种新的实现时,记得弄清两者区别。


这里简述java实现的应用层Socket通信方法并重点分析实现的区别。

具体实现已经有很多博客做详细说明。



一、TCP套接字

TCP套接字与UDP套接字编程

TCP套接字与UDP套接字编程

TCP套接字与UDP套接字编程

                    TCP套接字(来源:计算机网络-自顶向下方法)


->服务端

  1. Server初始化一个监听对象,绑定一个端口。
  2. 使用accept方法开始阻塞监听端口连接,方法返回一个Socket对象
  3. 然后开始从Socket对象里面读取输入流。利用I/0比如InputStreamReader读取Socket里面的内容,利用PrintWriter格式化往Socket里面输入数据,(注意都是通过一个Socket对象来进行内容的交流)


->客户端

1.创建Socket指定服务器的地址、端口的对象,请求连接(运输层三次握手)。

        同样用I/0流,通过这个Socket对象的输入输出流进行传输数据。


二、UDP套接字

TCP套接字与UDP套接字编程

TCP套接字与UDP套接字编程

                               UDP套接字(来源:计算机网络-自顶向下方法)



->服务端

同样UDP里面服务器需要绑定端口,监听等待传来数据包,接收到后开线程进行处理。


->客户端

而客户端不需要尝试连接,直接将目的地目的报文包装进DatagramSocket进行传输。接受数据也是基于DatagramSocket



三、最大区别:

1.TCP套接字编程如果想通信,客户端必须先往指定的目的地目的端口(即服务器的绑定的地方)请求建立Socket连接。

UDP套接字编程想通信,直接构建个报文(包含目的地,目的端口)包装进DatagramSocket一发送就成了,不需要提前往服务器建立连接。


2.TCP套接字面向连接,四元组的套接字标识,针对不同的来源IP,端口建立不同的通道(VIP)。

UDP套接字面向数据包,服务器只管接受来到它这的数据包。

△注意多路分解和多路复用中的区分。


3.TCP套接字编程基于流的操作: 依靠Socket建立起来的逻辑通道,通过输入流输出流进行数据传输,我们编程时将传输简化为简易的IO操作,十分简便。△注意同步问题。

 UDP套接字不是通过流将数据与套接字对象联系,而是通过一个一个封装好的分组通过套接字直接发送。