1.Socket相关概念
(1) Socket的英文原义是“孔”或者“插座”,作为进程通信机制,取后一种意思,通常也称作“套接字”,用于藐视IP地址和端口,是一个通信链的句柄(其实就是两个程序通信用的)。
(2) Socket非常类似于电话插座,以一个电话网为例,电话的通话双方相当于相互通信的2个程序,电话号码就是IP地址,任何用户在通话之前,首先要占有一部电话机,相当于申请一个Socket;同时要知道对方的电话号码,相当于对方有一个固定的Socket,然后向对方拨号呼叫,相当于发出连接请求,对方假如在场并且空闲,拿起电话话筒,双方就可以正式通话,相当于连接成功,双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向Socket发送数据和从Socket接收数据,通话结束后,一方挂起电话机相当于关闭Socket,撤销连接
(3) 在Internet上面有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务(应用程序)。
(4) 例如:http使用80端口,ftp使用21端口,smtp使用23端口。
(5) 有两种类型的Socket
1) 流式Socket(Stream)
是一种面向连接的Socket,针对于面向连接的TCP服务应用,安全,但是效率低。
2) 数据报式Socket(Datagram)
是一种无连接的Socket,对应于无连接的UDP服务应用,不安全(丢失,顺序混乱,在接收端要分析重排及要求重发),但是效率高。
2. Socket一般应用模式(服务器端和客户端)
(1) 如图所示,分析图示:
(2) 说明:
1) 服务端welcoming socket开始监听端口(负责监听客户端连接信息)。
2) 客户端client socket连接服务端指定端口(负责接收和发送服务器端消息)
3) 服务器端监听到客户端连接,创建connection socket(负责和客户端通信)
(3) 服务器端的Socket(至少需要两个)
1) 一个负责接收客户端连接请求(但不负责和客户端通信)
2) 每成功接收到一个客户端的连接便在服务器端产生一个对应的Socket。
1) 在接收到客户端连接时创建
2) 为每个连接成功的客户端请求在服务器端都创建一个对应的Socket(负责和客户端通信)。
(4) 客户端的Socket
1)客户端Socket
1) 必须指定要连接的服务器端地址和端口。
2) 通过创建一个Socket对象来初始化一个到服务器端的TCP连接。
(1) 服务器端
1) 申请一个Socket。
2) 绑定到一个IP地址和一个端口上。
3) 开启侦听,等待接收数据。
(2) 客户端
1) 申请一个Socket。
2) 连接服务器(指明IP地址和端口号)
3) 服务器端连接到连接请求后,产生一个新的Socket(端口大于1024)于客户端建立连接并进行通讯,原侦听Socket继续侦听。如图所示:
(1) 连接通过构造函数完成
(2) public Socket(AddressFamily address,SocketType socket,ProtocolType protocol)
1) AddressFamily成员指定Socket用来解析地址的寻址方案。例如:
InterNetWork相当于Socket使用一个IP版本4地址连接。
2) SocketType定义要打开的Socket的类型。
3) Socket类使用ProtocolType枚举向Windows Socket API通知所请求的协议
如:mySocket=new Socket(AddressFamily.InterNetWork,SocketType.Stream,ProtocolType.TCP);
(3) 注意:
1) 至少要定义一个要连接的远程主机的IP和端口号
2) 端口号必须为1和65535之间,最好在1024之后。
3) 要连接的远程主机必须正在监听指定端口,也就是说你无法随意连接远程主机。
如:IPAddress addr=IPAddress.Parse(10.10.4.200);
IPEndPoint endp=new IPEndPoint(addr,10001);
服务端先绑定:serverWelcomeSocket.Bind(endp);
客户端在连接:ClientSocket.Connect(endp);
(1) 相关类
1) IPAddress类:包含了一个IP地址
2) IPEndPoint类:包含了一对IP地址和端口号
(2) 相关方法
1) Socket():创建一个Socket。
2) Bind():绑定一个本地的IP和端口号(IPEndPoint)
3) Listen():让Socket侦听传入的连接尝试,并指定侦听队列容量。
4) Connect():初始化与另外一个Socket的连接。
5) Accept():接收连接并且返回一个新的Socket。
6) Send():输出数据到Socket。
7) Receive():从Socket中读取数据。
8) Close():关闭Socket(销毁连接)