套接字(socket)基本知识与工作原理
一、Socket相关概念
Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。(其实就是两个程序通信用的。)
SOCKET用于在两个基于TCP/IP协议的应用程序之间相互通信。最早出现在UNIX系统中,是UNIX系统主要的信息传递方式。在WINDOWS系统中,SOCKET称为WINSOCK。两个基本概念:客户方和服务方。当两个应用之间需要采用SOCKET通信时,首先需要在两个应用之间(可能位于同一台机器,也可能位于不同的机器)建立SOCKET连接,发起呼叫连接请求的一方为客户方,接受呼叫连接请求的一方成为服务方。客户方和服务方是相对的,同一个应用可以是客户方,也可以是服务方。在客户方呼叫连接请求之前,它必须知道服务方在哪里。所以需要知道服务方所在机器的IP地址或机器名称,如果客户方和服务方事前有一个约定就好了,这个约定就是PORT(端口号)。也就是说,客户方可以通过服务方所在机器的IP地址或机器名称和端口号唯一的确定方式来呼叫服务方。在客户方呼叫之前,服务方必须处于侦听状态,侦听是否有客户要求建立连接。一旦接到连接请求,服务方可以根据情况建立或拒绝连接。连接方式有两种,同步方式(Blocking)和(noBlocking).客户方发送的消息可以是文本,也可以是二进制信息流。当客户方的消息到达服务方端口时,会自动触发一个事件(event),服务方只要接管该事件,就可以接受来自客户方的消息了。
二、Socket有两种类型:
- 流式Socket(STREAM):是一种面向连接的Socekt,针对面向连接的TCP服务应用,安全,但是效率低;
- 数据报式Socket(DATAGAM):是一种无连接的Socket,对应于无连接的UDP服务应用。不安(丢失,顺序混乱,在接受端要分析重排及要求重发),但效率高。
三、Socket一般应用模式(服务端和客户端)
服务端的Socket(至少需要两个):
- 一个负责接受客户端连接请求(但不负责与客户端通信)
- 每成功接收到一个客户端的连接便在服务端产生一个对应的Socket
- 再接受到客户端连接时创建。
- 为每个连接成功的客户端请求在服务端都创建一个对应的Socket(负责和客户端通信)。
客户端的Socket
- 客户端Socket
- 必须指定要连接的服务端地址和端口。
- 通过创建一个Socket对象来初始化一个到服务端的TCP连接。
Socket通信基本流程图
Socket的通信过程
服务端:
- 申请一个Socket
- 绑定到一个IP地址和一个端口
- 开启侦听,等待接受连接
客户端:
- 申请一个Socket
- 连接服务器(指明IP地址和端口号)
服务器端接到连接请求后,产生一个新的Socket(端口大于1024)与客户端建立连接并进行通讯,原侦听Socket继续侦听。