C# Socket系列一 简单的创建socket的监听

简介:

socket的应用场景,在快速,稳定,保持长连接的数据传输代码。Http也是socket封装出来的,基于一次请求一次回复,然后断开的socket连接封装。

比如我们常见的游戏服务器,目前的很火的物联网服务器,都需要开启socket服务器去监听实时传输的数据。

那么我们如何实现socket的监听呢。说到这里,我们需要知道,socket的监听分为tcp和udp两种形式,但是tcp其实是udp封装而来的,可看做可靠的udp传输,基于udp的定向传输,收到消息回复发送方收到消息。等验证,来实现tcp的数据传输,所以一般我们tcp的传输相对udp稍微慢一点。

我们先将一下socket 的tcp状态创建一个TCPListener类

?
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
/// <summary>
     /// 建立TCP通信监听服务
     /// </summary>
     internal class TCPListener
     {
         private IPEndPoint _IP;
         private Socket _Listeners;
         private volatile bool IsInit = false ;
         private List<TSocketBase> sockets = new List<TSocketBase>();
 
         /// <summary>
         /// 初始化服务器
         /// </summary>
         public TCPListener( string ip = "0.0.0.0" , int port = 9527)
         {
             IsInit = true ;
             IPEndPoint localEP = new IPEndPoint(IPAddress.Parse(ip), port);
             this ._IP = localEP;
             try
             {
                 Console.WriteLine( string .Format( "Listen Tcp -> {0}:{1} " , ip, port));
                 this ._Listeners = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                 this ._Listeners.Bind( this ._IP);
                 this ._Listeners.Listen(5000);
                 SocketAsyncEventArgs sea = new SocketAsyncEventArgs();
                 sea.Completed += new EventHandler<SocketAsyncEventArgs>( this .AcceptAsync_Async);
                 this .AcceptAsync(sea);
             }
             catch (Exception ex)
             {
                 Console.WriteLine(ex);
                 this .Dispose();
             }
         }
 
         private void AcceptAsync(SocketAsyncEventArgs sae)
         {
             if (IsInit)
             {
                 if (! this ._Listeners.AcceptAsync(sae))
                 {
                     AcceptAsync_Async( this , sae);
                 }
             }
             else
             {
                 if (sae != null )
                 {
                     sae.Dispose();
                 }
             }
         }
 
         private void AcceptAsync_Async( object sender, SocketAsyncEventArgs sae)
         {
             if (sae.SocketError == SocketError.Success)
             {
                 var socket = new TSocketClient(sae.AcceptSocket);
                 sockets.Add(socket);
                 Console.WriteLine( "Remote Socket LocalEndPoint:" + sae.AcceptSocket.LocalEndPoint + " RemoteEndPoint:" +
                                   sae.AcceptSocket.RemoteEndPoint.ToString());
             }
             sae.AcceptSocket = null ;
             if (IsInit)
             {
                 this ._Listeners.AcceptAsync(sae);
             }
             else
             {
                 sae.Dispose();
             }
         }
 
         /// <summary>
         /// 释放资源
         /// </summary>
         public void Dispose()
         {
             if (IsInit)
             {
                 IsInit = false ;
                 this .Dispose( true );
                 GC.SuppressFinalize( this );
             }
         }
 
         /// <summary>
         /// 释放所占用的资源
         /// </summary>
         /// <param name="flag1"></param>
         protected virtual void Dispose([MarshalAs(UnmanagedType.U1)] bool flag1)
         {
             if (flag1)
             {
                 if (_Listeners != null )
                 {
                     try
                     {
                         Console.WriteLine( string .Format( "Stop Listener Tcp -> {0}:{1} " , this .IP.Address.ToString(),
                             this .IP.Port));
                         _Listeners.Close();
                         _Listeners.Dispose();
                     }
                     catch
                     {
                     }
                 }
             }
         }
 
         /// <summary>
         /// 获取绑定终结点
         /// </summary>
         public IPEndPoint IP
         {
             get { return this ._IP; }
         }
     }

  

主要两点我们socket的初始化代码 new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);初始化的类型是基于tcp。

还有就是我们绑定ip地址,过去很多人socket的bind地址习惯写成127.0.0.1(测试环境)或者读取网卡信息,读取ip地址,这样麻烦,代码要写很多,切不符合多网卡多线路实际环境。我们用0.0.0.0是表示开启ipv4的所有线路监听,包括你的多路网卡,以及127.0.0.1

复制代码
复制代码
1     class Program
2     {
3         static void Main(string[] args)
4         {
5             TCPListener tcp = new TCPListener();
6             Console.ReadLine();
7         }
8     }
复制代码
复制代码

我们运行看一下效果

 

接下来我们使用telnet测试一下

开启telnet

 

然后打开cmd 

输入 telnet 127.0.0.1 9527

 

我们看到收到了一个连接

 

 

本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/p/7238610.html/,如需转载请自行联系原作者

 

相关实践学习
SAE极速部署弹性微服务商城
本实验带您体验在Serverless应用引擎SAE(Serverless App Engine)上快速部署一个弹性的在线商城微服务应用,使得终端用户可以通过公网访问访问该商城,并进行压力测试以验证其性能与稳定性。
相关文章
|
数据处理 C# C++
如何使用C#和C++结构体实现Socket通信
如何使用C#和C++结构体实现Socket通信
794 0
|
9月前
|
存储 安全 固态存储
基于C#实现的支持文件传输的Socket聊天室
基于C#实现的支持文件传输的Socket聊天室
455 5
|
C# 开发者
C# 一分钟浅谈:Socket 编程基础
【10月更文挑战第7天】本文介绍了Socket编程的基础知识、基本操作及常见问题,通过C#代码示例详细展示了服务器端和客户端的Socket通信过程,包括创建、绑定、监听、连接、数据收发及关闭等步骤,帮助开发者掌握Socket编程的核心技术和注意事项。
520 3
C# 一分钟浅谈:Socket 编程基础
|
网络协议 C# 开发工具
C#中简单Socket编程
1. 先运行服务器代码。服务器将开始监听指定的IP和端口,等待客户端连接。 1. 然后运行客户端代码。客户端将连接到服务器并发送消息。 1. 服务器接收到消息后,将回应客户端,并在控制台上显示接收到的消息。 1. 客户端接收到服务器的回应消息,并在控制台上显示。
871 15
|
消息中间件 网络协议 C#
C#使用Socket实现分布式事件总线,不依赖第三方MQ
`CodeWF.EventBus.Socket` 是一个轻量级的、基于Socket的分布式事件总线系统,旨在简化分布式架构中的事件通信。它允许进程之间通过发布/订阅模式进行通信,无需依赖外部消息队列服务。
C#使用Socket实现分布式事件总线,不依赖第三方MQ
|
移动开发 监控 网络协议
基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
|
Java Android开发
Java Socket编程示例:服务器开启在8080端口监听,接收客户端连接并打印消息。
【6月更文挑战第23天】 Java Socket编程示例:服务器开启在8080端口监听,接收客户端连接并打印消息。客户端连接服务器,发送&quot;Hello, Server!&quot;后关闭。注意Android中需避免主线程进行网络操作。
442 4
|
C#
C# 使用Socket对接
C# 使用Socket对接
179 1
|
JSON C# 图形学
【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)
【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)
1133 1
|
网络协议 Unix Linux
【Unity 3D】C#中Socket及TCP三次握手与四次挥手详解(超详细 图文解释)
【Unity 3D】C#中Socket及TCP三次握手与四次挥手详解(超详细 图文解释)
777 0