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

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

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

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

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

  1  /// <summary>
  2     /// 建立TCP通信监听服务
  3     /// </summary>
  4     internal class TCPListener
  5     {
  6         private IPEndPoint _IP;
  7         private Socket _Listeners;
  8         private volatile bool IsInit = false;
  9         List<TSocketBase> sockets = new List<TSocketBase>();
 10
 11         /// <summary>
 12         /// 初始化服务器
 13         /// </summary>
 14         public TCPListener(string ip = "0.0.0.0", int port = 9527)
 15         {
 16             IsInit = true;
 17             IPEndPoint localEP = new IPEndPoint(IPAddress.Parse(ip), port);
 18             this._IP = localEP;
 19             try
 20             {
 21                 Console.WriteLine(string.Format("Listen Tcp -> {0}:{1} ", ip, port));
 22                 this._Listeners = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 23                 this._Listeners.Bind(this._IP);
 24                 this._Listeners.Listen(5000);
 25                 SocketAsyncEventArgs sea = new SocketAsyncEventArgs();
 26                 sea.Completed += new EventHandler<SocketAsyncEventArgs>(this.AcceptAsync_Async);
 27                 this.AcceptAsync(sea);
 28             }
 29             catch (Exception ex)
 30             {
 31                 Console.WriteLine(ex);
 32                 this.Dispose();
 33             }
 34         }
 35
 36         private void AcceptAsync(SocketAsyncEventArgs sae)
 37         {
 38             if (IsInit)
 39             {
 40                 if (!this._Listeners.AcceptAsync(sae))
 41                 {
 42                     AcceptAsync_Async(this, sae);
 43                 }
 44             }
 45             else
 46             {
 47                 if (sae != null)
 48                 {
 49                     sae.Dispose();
 50                 }
 51             }
 52         }
 53
 54         private void AcceptAsync_Async(object sender, SocketAsyncEventArgs sae)
 55         {
 56             if (sae.SocketError == SocketError.Success)
 57             {
 58                 var socket = new TSocketClient(sae.AcceptSocket);
 59                 sockets.Add(socket);
 60                 Console.WriteLine("Remote Socket LocalEndPoint:" + sae.AcceptSocket.LocalEndPoint + " RemoteEndPoint:" + sae.AcceptSocket.RemoteEndPoint.ToString());
 61             }
 62             sae.AcceptSocket = null;
 63             if (IsInit)
 64             {
 65                 this._Listeners.AcceptAsync(sae);
 66             }
 67             else { sae.Dispose(); }
 68         }
 69
 70         /// <summary>
 71         /// 释放资源
 72         /// </summary>
 73         public void Dispose()
 74         {
 75             if (IsInit)
 76             {
 77                 IsInit = false;
 78                 this.Dispose(true);
 79                 GC.SuppressFinalize(this);
 80             }
 81         }
 82         /// <summary>
 83         /// 释放所占用的资源
 84         /// </summary>
 85         /// <param name="flag1"></param>
 86         protected virtual void Dispose([MarshalAs(UnmanagedType.U1)] bool flag1)
 87         {
 88             if (flag1)
 89             {
 90                 if (_Listeners != null)
 91                 {
 92                     try
 93                     {
 94                         Console.WriteLine(string.Format("Stop Listener Tcp -> {0}:{1} ", this.IP.Address.ToString(), this.IP.Port));
 95                         _Listeners.Close();
 96                         _Listeners.Dispose();
 97                     }
 98                     catch { }
 99                 }
100             }
101         }
102
103         /// <summary>
104         /// 获取绑定终结点
105         /// </summary>
106         public IPEndPoint IP { get { return this._IP; } }
107     }

主要两点我们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

我们看到收到了一个连接

时间: 2024-10-01 21:34:15

C# Socket系列一 简单的创建socket的监听的相关文章

socket + pcntl_fork 实现客户端请求,服务器实时监听返回处理 消息推送

<?php /* socket链接整个过程 1,socket_create 第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET: 第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM.数据报套接字类型为SOCK_DGRAM.原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据包以及协议首部): 第三个参数指定应用程序所使用的通信协议.此参数可以指定单个协议系列中的不同传输协议.在Inter

前端简单实现校招笔试&#39;作弊监听&#39;功能

一. 监听你的页面活动 最近校招笔试如火如荼地开展.各种小心思都浮上来了:"我就查一道".小心翼翼按了一下tab切换(mac用三爪),Document.visibilityState开始工作了."监测到你切换页面,超过xx次将影响你的成绩(希望你自重)" 二. visibilityState 值 描述 visible 此时页面内容至少是部分可见. 即此页面在前景标签页中,并且窗口没有最小化. hidden 此时页面对用户不可见. 即文档处于背景标签页或者窗口处于最小

apache 创建多端口监听

httpd.conf 将 #LoadModule vhost_alias_module modules/mod_vhost_alias.so 改为 LoadModule vhost_alias_module modules/mod_vhost_alias.so 将 #Include conf/extra/httpd-vhosts.conf 改为 Include conf/extra/httpd-vhosts.conf httpd-vhosts.conf #监听多个端口 Listen 80 Lis

基于socket实现的简单的聊天程序

记得八年前第一次使用socket做的一个五子棋程序,需要序列化棋子对象,传递到对方的电脑上. 一个偶然的机会,第二次使用socket做点事情.先看聊天服务器端的实现: 服务器端要实现以下功能:      1.启动服务,开启监听      2.持续不断地接收消息      3.发送消息 启动服务,创建监听socket,绑定Ip和端口: 1 /// <summary> 2 /// 启动服务 3 /// </summary> 4 private void Start() 5 { 6 so

oracle 10g 数据库与客户端冲突导致实例创建无监听问题

同事在oracle 10g上创建一个实例,快结束时弹出一个错误,提示监听失败之类.查看服务,并无生成监听服务.于是删除重来,一连试了好几次,都是如此. 这真是令人心烦意乱.提示里面有说到端口1521,难道此端口被占用了?用netstat -aon命令看了下,并没有.而且创建实例过程中,并没有什么地方可以设置端口的. 后来试了下Net manager,手动创建了一个监听.看系统服务,发现已有listener:然后修改 tnsnames.ora 文件,创建一个连接串,连接,成功. 其实呢,我修改的那

nginx源码分析--监听套接字的创建 套接字的监听 HTTP请求创建连接

作为一个web服务器,那么肯定是有监听套接字的,这个监听套接字是用于接收HTTP请求的,这个监听套接字的创建是根据配置文件的内容来创建的,在nginx.conf文件中有多少个地址就需要创建多少个监听套接字.这里不说各个结构体的构造 只说大体情况! 1).首先在main函数中调用了ngx_init_cycle()函数,在这个函数的最后调用了ngx_open_listening_sockets函数,这个函数负责将创建的监听套接字进行套接字选项的设置(比如非阻塞.接受发送的缓冲区.绑定.监听处理) 2

nginx源代码分析--监听套接字的创建 套接字的监听 HTTP请求创建连接

作为一个webserver,那么肯定是有监听套接字的,这个监听套接字是用于接收HTTP请求的,这个监听套接字的创建是依据配置文件的内容来创建的,在nginx.conf文件里有多少个地址就须要创建多少个监听套接字.这里不说各个结构体的构造 仅仅说大体情况! 1).首先在main函数中调用了ngx_init_cycle()函数,在这个函数的最后调用了ngx_open_listening_sockets函数,这个函数负责将创建的监听套接字进行套接字选项的设置(比方非堵塞.接受发送的缓冲区.绑定.监听处

简单剖析Node中的事件监听机制(一)

使用js的class类简单的实现一个事件监听机制,不同于浏览器中的时间绑定与监听,类似于node中的时间监听,并且会在接下来的文章中去根据自己的理解去写一下Event模块中的原理. Node.js使用了一个事件驱动.非阻塞式I/O的模型,使其轻量又高效.并且Node中的大量模块都使用了Event机制,因此可以说是整个Node中最重要的模块之一. 实例: let event = new eventEmitter(); event.on('someType',function(){ }); even

自动化运维Python系列(七)之Socket编程

了解知识点TCP\IP 要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准, 从字面意思来看TCP/IP是TCP和IP协议的合称,但实际上TCP/IP协议是指因特网整个TCP/IP协议族.不同于ISO模型的七个分层,TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中(数据链路层和物理