用C++和Java很容易实现socket通信,两者大同小异,注意在尝试换一种新的实现时,记得弄清两者区别。
这里简述java实现的应用层Socket通信方法,并重点分析实现的区别。
具体实现已经有很多博客做详细说明。
一、TCP套接字
TCP套接字(来源:计算机网络-自顶向下方法)
->服务端
-
Server初始化一个监听对象,绑定一个端口。
-
使用accept方法开始阻塞监听端口连接,方法返回一个Socket对象
-
然后开始从Socket对象里面读取输入流。 利用I/0比如InputStreamReader读取Socket里面的内容,利用PrintWriter格式化往Socket里面输入数据,(注意都是通过一个Socket对象来进行内容的交流)
->客户端
1.创建Socket指定服务器的地址、端口的对象,请求连接(运输层三次握手)。
同样用I/0流,通过这个Socket对象的输入输出流进行传输数据。
二、UDP套接字
UDP套接字(来源:计算机网络-自顶向下方法)
->服务端
同样UDP里面服务器需要绑定端口,监听等待传来数据包,接收到后开线程进行处理。
->客户端
而客户端不需要尝试连接,直接将目的地目的报文包装进DatagramSocket进行传输。接受数据也是基于DatagramSocket。
三、最大区别:
1.TCP套接字编程如果想通信,客户端必须先往指定的目的地目的端口(即服务器的绑定的地方)请求建立Socket连接。
UDP套接字编程想通信,直接构建个报文(包含目的地,目的端口)包装进DatagramSocket一发送就成了,不需要提前往服务器建立连接。
2.TCP套接字面向连接,四元组的套接字标识,针对不同的来源IP,端口建立不同的通道(VIP)。
UDP套接字面向数据包,服务器只管接受来到它这的数据包。
△注意多路分解和多路复用中的区分。
3.TCP套接字编程基于流的操作: 依靠Socket建立起来的逻辑通道,通过输入流输出流进行数据传输,我们编程时将传输简化为简易的IO操作,十分简便。△注意同步问题。
UDP套接字不是通过流将数据与套接字对象联系,而是通过一个一个封装好的分组通过套接字直接发送。