1、什么是Socket
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
传输层实现端到端的通信,因此,每一个传输层连接有两个端点。那么,传输层连接的端点是什么呢?不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。传输层连接的端点叫做套接字(socket)。根据RFC793的定义:端口号拼接到IP地址就构成了套接字。所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一个16位的主机端口号,即形如(主机IP地址:端口号)。例如,如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)。
那么套接字这个抽象层位于TCP/IP协议簇四层结构中的哪个位置呢?看下图就一目了然了:
它位于应用层与传输层之间,是一组封装好的接口,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据。
2、Java Socket实现
2.1、主要方法
- Accept方法用于产生”阻塞”,直到接受到一个连接,并且返回一个客户端的Socket对象实例。”阻塞”是一个术语,它使程序运行暂时”停留”在这个地方,直到一个会话产生,然后程序继续;通常”阻塞”是由循环产生的。
- getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。
- getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。
2.2、服务器端
- 创建ServerSocket对象,绑定监听端口。
- 通过accept()方法监听客户端请求。
- 连接建立后,通过输入流读取客户端发送的请求信息。
- 通过输出流向客户端发送响应信息。
- 关闭响应的资源。
2.3、客户端
- 创建Socket对象,指明需要连接的服务器的地址和端口号。
- 连接建立后,通过输出流向服务器发送请求信息。
- 通过输入流获取服务器响应的信息。
- 关闭相应资源。
2.4、多线程实现服务器与多客户端之间通信步骤
- 服务器端创建ServerSocket,循环调用accept()等待客户端连接。
- 客户端创建一个socket并请求和服务器端连接。
- 服务器端接受客户端请求,创建socket与该客户建立专线连接。
- 建立连接的两个socket在一个单独的线程上对话。
- 服务器端继续等待新的连接。
2.5、客户端代码
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class SocketClient {
public static void main(String args