服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#基于Socket的网络通信类你了解吗

C#基于Socket的网络通信类你了解吗

2023-02-24 15:19IT技术猿猴 C#

这篇文章主要为大家详细介绍了C#基于Socket的网络通信类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

摘要

之所以要进行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

延伸 · 阅读

精彩推荐
  • C#C#中的9个“黑魔法”

    C#中的9个“黑魔法”

    这篇文章主要介绍了C#中的9个“黑魔法”与“骚操作”,本文通过实例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的...

    .NET骚操作6822022-08-30
  • C#C# interface与delegate效能比较的深入解析

    C# interface与delegate效能比较的深入解析

    本篇文章是对C#中interface与delegate的效能比较进行了详细的分析介绍,需要的朋友参考下...

    C#教程网5042020-12-14
  • C#C#实现谷歌翻译API示例代码

    C#实现谷歌翻译API示例代码

    本篇文章主要介绍了C#实现谷歌翻译API示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    marso11122022-01-07
  • C#Unity实现音频播放管理器

    Unity实现音频播放管理器

    这篇文章主要为大家详细介绍了Unity实现音频播放管理器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    SandmanRUN12152022-10-09
  • C#C#实现自定义圆角按钮的方法

    C#实现自定义圆角按钮的方法

    Winform中自带的button没有圆角属性,所以我们继承Button类,重写OnPaint事件来绘制圆角按钮。下面通过实例代码给大家介绍下C#实现自定义圆角按钮的方法,需...

    胖达没有海10992022-12-08
  • C#C#开发Android百度地图手机应用程序(多地图展示)

    C#开发Android百度地图手机应用程序(多地图展示)

    这篇文章主要介绍了C#开发Android百度地图手机应用程序(多地图展示)的相关资料,需要的朋友可以参考下...

    rainmj7102021-11-12
  • C#聊聊C# 中HashTable与Dictionary的区别说明

    聊聊C# 中HashTable与Dictionary的区别说明

    这篇文章主要介绍了聊聊C# 中HashTable与Dictionary的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    冬冬他哥哥4562022-10-29
  • C#C#操作本地文件及保存文件到数据库的基本方法总结

    C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件...

    死神的丧钟6792021-11-22