Socket通信作为Java网络通讯的基础内容,建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供做网络开发所用的接口,这就是Socket编程接口。
Socket通信分为基于TCP的Socket通信(使用流式套接字,提供可靠、面向连接的通信流)以及基于UDP的Socket通信(使用数据报套接字,定义一种无连接服务)。
编程实现步骤如下:
1)服务器端创建其提供服务的端口号,即服务器端中提供服务的应用程序接口名称。
服务器端ServerSocket:ServerSocket serverSocket =newServerSocket(intport,intbacklog);ServerSocket作用是向操作系统注册相应协议服务,申请端口并监听这个端口是否有链接请求。其中port是端口号,backlog是服务器最多允许链接的客户端数。注册完成后,服务器分配此端口用于提供某一项进程服务。
2)服务器端(Server)和客户端(Client)都创建各自的Socket对象。
服务器端Socket:Socket socket = serverSocket.accept();服务器端创建一个socket对象用于等待客户端socket的链接(accept方法是创建一个阻塞队列,只有客户端socket申请链接到服务器后,服务器端socket才能收到消息) 。如果服务器端socket收到客户端的链接请求,那么经过"三次握手"过程,建立客户端与服务器端的连接。如果连接不成功,则抛出异常(详见模块三)。
客户端Socket:Socket socket =newSocket(String host,intport);客户端创建按一个socket对象用于链接具体服务器host的具体服务端口port,用于获得服务器进程的相应服务。
经过三次握手后,一个Socket通路就建立起来。此时,服务器端和客户端就可以开始通讯了。
3)服务器端和客户端打开链接到Socket通路的I/O流,按照一定协议进行数据通信。
协议就是指发送与接受数据的编码格式(计算机网络中为:语义、同步)。简单说就是输入和输出的流必须匹配。
开启网络输入流:网络输入流指的是从socket通道进入计算机内存的流。socket.getInputStream();返回值InputStream 输入字节流
开启网络输出流:网络输出流指的是从计算机内存走出到socket通道的流。socket.getOutputStream();返回值OutputStream 输出字节流,为了通讯方便,往往将低级流包装成高级流进行服务端与客户端之间的交互。
4)通信完毕,关闭网络流
一般而言,服务器端的流是不用关闭的,当然在某些条件下(比如服务器需要维护)也是需要关闭的。而客户端一般都需要关闭。