TCP通信
UDP不区分客户端与服务器端,计算机之间可以任意的发送数据。TCP是分客户端和服务器端的,在通信时,必须先建立连接才能通信(上一篇写了连接的三步骤)
JDK提供了ServerSocket类实现服务器端,Socket类实现客户端。
通信时,先创建代表服务器端的ServerSocket对象,该对象相当于开启一个服务,并等待客户端的连接,然后再创建代表客户端的Socket对象向服务器端发出请求连接。
ServerSocket包含-一个监听来自客户端连接请求的方法:
Socket accept():如果接收到一个客户端Socket的连接请求,该方法将返回一个与客户端Socket对应的Socket (如图17.4 所示,每个TCP连接有两个Socket);否则该方法将一直处 于等待状态,线程也被阻塞。
ServerSocket对象负责监听某台计算机的某个端口号,在创建ServerSocket对象后,需要继续调用该对象的accept()方法,接收来自客户端的请求。执行accept方法后,服务器端程序会发生阻塞,直到客户端发出连接请求,accept方法才会返回一个Socket对象用于和客户端实现通信,程序才能继续执行。
Socket
当客户端、服务器端产生了对应的Socket之后,程序无须再区分服务器端、客户端,而是通过各自的Socket 进行通信。
Socket提供的两个方法获得输入流和输出流:
InputStream getInputStream():返回该Socket对象对应的输入流,让程序通过该输入流从Socket中取出数据。
OutputStream getOutputStream():返回该Socket对象对应的输出流,让程序通过该输出流向Socket中输出数据。
一般的服务器都是多线程的(盲猜群聊就要这样实现),多个客户端访问服务器端时,服务器端为每个客户端创建一个对应的Socket,并且开启一个新的线程使两个Spcket建立专线进行通信。