一、socket编程
(一)端口(port)
每个应用程序都有一个端口
192.168.1.3:101,其中101就为该应用程序的端口
(二)套接字(socket)
1.原义
英文原义为“插座”,作为进程通信机制,称为套接字,用于描述IP地址和端口,是一个通信链的句柄。(其实就是两个程序通信用的)
2.解释(socket=电话号)
套接字非常类似电话插座。以一个电话网为例,通话的双方相当于互相通信的两个程序,电话号码就是IP地址。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求。对方加入在场并空闲,拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤销连接。
(三)Socket相关概念
1.在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开了一个Socket,并绑定到一个端口上。不同的端口对应于不同的服务(应用程序)。
2.两种类型Socket
a)流式Socket(STREAM)
是一种面向连接的socket,针对面向连接的TCP服务应用。特点是安全,但效率低
b)数据报式Socket(DATAGRAM)
是一种无连接的Socket,对应于无连接的UDP服务应用。特点是不安全(丢包、顺序混乱),但效率高
二、Socket一般应用模式(服务器端和客户端)
(一)流程:
1.服务器端welcoming socket开始监听端口(负责监听客户端连接信息)
2.客户端client socket连接服务器端指定端口(负责接受和发送服务端消息)
3.服务器端welcoming socket监听到客户端连接,创建connection socket(负责和客户端通信)
(二)服务器端的socket(至少两个)
1.welcoming socket:负责接受客户端请求(但不负责与客户端通信)
2.connection socket:每成功接听到一个客户端的连接便在服务器端产生一个对应的socket
a)在接收到客户端连接时创建
b)为每个连接成功的客户端请求在服务器端都创建一个对应的socket(负责与客户端通信)
(三)客户端的socket(只有一个)
client socket
a)必须指定要连接的服务器端地址和端口
b)通过创建一个socket对象来初始化一个到服务器端的TCP连接
2.客户端
三、Socket的通讯过程
(一)服务器端
1.申请一个socket
2.绑定到一个IP地址和一个端口上
3.开始监听,等待接收连接
//创建服务端负责监听的套接字,参数(使用ip4寻址协议,使用流式连接,使用tcp协议传输数据)(二)客户端
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//获得文本框中的IP地址对象
IPAddress address = IPAddress.Parse(txtIP.Text.Trim());//Trim()方法用于去掉字符串开头和结尾的空白
//串讲包含ip和port的网络节点对象
IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
//将负责监听的套接字绑定到唯一的IP和端口上
socketWatch.Bind(endpoint);
//设置队列长度
socketWatch.Listen(10);
//创建负责通信的套接字,开始监听客户端请求。注意,Accept()方法会阻断当前线程
Socket socketConnection = socketWatch.Accept();
1.申请一个socket
2.连接服务器(指明IP地址和端口)
(三)服务器端接到连接请求后,产生一个新的socket(端口大于1024)与客户端建立连接并进行通讯,原监听套接字继续监听
/// <summary>
/// 持续监听客户端连接请求,并且在监听到客户端连接请求后创建与客户端通信的socket
/// </summary>
void WatchConnecting()
{
//当监听到用户连接请求后,socketWatch继续监听
while (true)
{
//一旦监听到用户连接请求,就返回一个于客户端通信的socket,socketwatch就停止监听了
Socket socketConnection = socketWatch.Accept();
ShowMsg("客户端连接成功!");
}
}