摘要
之所以要进行Socket套接字通信库封装,主要是直接使用套接字进行网络通信编程相对复杂,特别对于初学者而言。实际上微软从.net 2.0开始已经提供了TCP、UDP通信高级封装类如下:
1
2
3
|
TcpListener TcpClient UdpClient |
微软从.net 4.0开始提供基于Task任务的异步通信接口。而直接使用socket封装库,很多socket本身的细节没办法自行控制,本文目就是提供一种socket的封装供参考。文中展示部分封装了TCP通信库,UDP封装也可触类旁通:
1
2
|
CusTcpListener CusTcpClient |
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
|
using System; using System.Text; using System.Net.Sockets; using System.Net; namespace NetDemo { // 网络操作相关的类 public class InternetProHelper { // 检查设置的端口号是否正确,并返回正确的端口号,无效端口号返回-1 public static int GetNetPort( string NetPort) { //声明返回的正确端口号 int resPort = -1; //检测端口号 try { //传入的端口号为空则抛出异常 if (NetPort == "" ) { throw new Exception( "端口号不能为空!" ); } //检测端口范围 if ((Convert.ToInt32(NetPort) < ushort .MinValue) || (Convert.ToInt32(NetPort) > ushort .MaxValue)) { throw new Exception( "端口号范围无效!" ); } //为端口号赋值 resPort = Convert.ToInt32(NetPort); } catch (Exception ex) { string errMessage = ex.Message; } return resPort; } public static IPAddress StringToIPAddress( string NetIP) { // 将字符串形式的IP地址转换成IPAddress对象 return IPAddress.Parse(NetIP); } public static string LocalHostName { // 获取本机的计算机名 get { return Dns.GetHostName(); } } public static string LANIP { // 获取本机的局域网IP get { //获取本机的IP列表,IP列表中的第一项是局域网IP,第二项是广域网IP IPAddress[] IPaddrList = Dns.GetHostEntry(Dns.GetHostName()).AddressList; //如果本机IP列表为空,则返回空字符串 if (IPaddrList.Length < 1) { return "" ; } //返回本机的局域网IP return IPaddrList[0].ToString(); } } public static string GetClientIP(Socket clientSocket) { // 获取远程客户机的IP地址 IPEndPoint client = (IPEndPoint)clientSocket.RemoteEndPoint; //客户端的NetSocket对象 return client.Address.ToString(); } public static IPEndPoint CreateIPEndPoint( string NetIP, int NetPort) { // 创建一个IPEndPoint对象 IPAddress ipAddress = StringToIPAddress(NetIP); return new IPEndPoint(ipAddress, NetPort); } public static TcpListener CreateTcpListener() { //创建一个自动分配的网络节点 IPAddress ipAddress = IPAddress.Any; IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 0); return new TcpListener(localEndPoint); } public static TcpListener CreateTcpListener( string NetIP, int NetPort) { //创建一个网络节点 IPAddress ipAddress = StringToIPAddress(NetIP); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, NetPort); return new TcpListener(localEndPoint); } public static Socket CreateTcpSocket() { // 创建一个基于TCP协议的Socket对象 return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); } public static Socket CreateUdpSocket() { // 创建一个基于UDP协议的Socket对象 return new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); } public static IPEndPoint GetLocalPoint(TcpListener tcpListener) { // 获取TcpListener对象的本地终结点 return (IPEndPoint)tcpListener.LocalEndpoint; } public static string GetLocalPoint_IP(TcpListener tcpListener) { // 获取TcpListener对象的本地终结点的IP地址 IPEndPoint localEndPoint = (IPEndPoint)tcpListener.LocalEndpoint; return localEndPoint.Address.ToString(); } public static int GetLocalPoint_Port(TcpListener tcpListener) { // 获取TcpListener对象的本地终结点的端口号 IPEndPoint localEndPoint = (IPEndPoint)tcpListener.LocalEndpoint; return localEndPoint.Port; } public static IPEndPoint GetLocalPoint(Socket NetSocket) { // 获取Socket对象的本地终结点 return (IPEndPoint)NetSocket.LocalEndPoint; } public static string GetLocalPoint_IP(Socket NetSocket) { // 获取Socket对象的本地终结点的IP地址 IPEndPoint localEndPoint = (IPEndPoint)NetSocket.LocalEndPoint; return localEndPoint.Address.ToString(); } public static int GetLocalPoint_Port(Socket NetSocket) { // 获取Socket对象的本地终结点的端口号 IPEndPoint localEndPoint = (IPEndPoint)NetSocket.LocalEndPoint; return localEndPoint.Port; } public static void BindEndPoint(Socket NetSocket, IPEndPoint endPoint) { // 绑定终结点 if (!NetSocket.IsBound) { NetSocket.Bind(endPoint); } } public static void BindEndPoint(Socket NetSocket, string NetIP, int NetPort) { //创建终结点 IPEndPoint endPoint = CreateIPEndPoint(NetIP, NetPort); //绑定终结点 if (!NetSocket.IsBound) { NetSocket.Bind(endPoint); } } public static void StartListen(Socket NetSocket, int NetPort) { //创建本地终结点 IPEndPoint localPoint = CreateIPEndPoint(InternetProHelper.LocalHostName, NetPort); //绑定到本地终结点 BindEndPoint(NetSocket, localPoint); //开始监听 NetSocket.Listen(200); } public static void StartListen(Socket NetSocket, int NetPort, int maxConnection) { //创建本地终结点 IPEndPoint localPoint = CreateIPEndPoint(InternetProHelper.LocalHostName, NetPort); //绑定到本地终结点 BindEndPoint(NetSocket, localPoint); //开始监听 NetSocket.Listen(maxConnection); } public static void StartListen(Socket NetSocket, string NetIP, int NetPort, int maxConnection) { //绑定到本地终结点 BindEndPoint(NetSocket, NetIP, NetPort); //开始监听 NetSocket.Listen(maxConnection); } public static bool Connect(Socket NetSocket, string NetIP, int NetPort) { // 连接到基于TCP协议的服务器,连接成功返回true,否则返回false try { //连接服务器 NetSocket.Connect(NetIP, NetPort); //检测连接状态 return NetSocket.Poll(-1, SelectMode.SelectWrite); } catch (SocketException ex) { throw new Exception(ex.Message); } } // 以同步方式向指定的Socket对象发送消息 public static void SendMsg(Socket NetSocket, byte [] dataStr) { //发送消息 NetSocket.Send(dataStr, dataStr.Length, SocketFlags.None); } // 使用UTF8编码格式以同步方式向指定的Socket对象发送消息 public static void SendMsg(Socket NetSocket, string dataStr) { //将字符串消息转换成字符数组 byte [] NetBuf = System.Text.Encoding.UTF8.GetBytes(dataStr); //发送消息 NetSocket.Send(NetBuf, NetBuf.Length, SocketFlags.None); } // 以同步方式接收消息 public static void ReceiveMsg(Socket NetSocket, byte [] NetBuf) { NetSocket.Receive(NetBuf); } // 以同步方式接收消息 public static string ReceiveMsg(Socket NetSocket) { //定义接收缓冲区 byte [] NetBuf = new byte [10000]; //接收数据,获取接收到的字节数 int RecvNum = NetSocket.Receive(NetBuf); //定义临时缓冲区 byte [] DataBuf = new byte [RecvNum]; //将接收到的数据写入临时缓冲区 Buffer.BlockCopy(NetBuf, 0, DataBuf, 0, RecvNum); //对DataBuf进行处理 return Convert.ToString(DataBuf); } // 关闭基于Tcp协议的Socket对象 public static void Close(Socket NetSocket) { try { //禁止Socket对象接收和发送数据 NetSocket.Shutdown(SocketShutdown.Both); } catch (SocketException ex) { throw ex; } finally { //关闭Socket对象 NetSocket.Close(); } } } } |
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/baobingji/article/details/123777728