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

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

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

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

  /// <summary>
     /// 建立TCP通信监听服务
     /// </summary>
     internal class TCPListener
     {
         private IPEndPoint _IP;
         private Socket _Listeners;
         private volatile bool IsInit = false;
         List<TSocketBase> sockets = new List<TSocketBase>();

         /// <summary>
         /// 初始化服务器
         /// </summary>
         )
         {
             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);
                 );
                 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

     class Program
     {
         static void Main(string[] args)
         {
             TCPListener tcp = new TCPListener();
             Console.ReadLine();
         }
     }

我们运行看一下效果

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

开启telnet

然后打开cmd

输入 telnet 127.0.0.1 9527

我们看到收到了一个连接

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

  1. C# Socket系列二 简单的创建 socket 通信

    看了系列一 我们开启了对socket tcp的监听状态,那么这一章我们来讲解怎么创建socket的通信代码 我新建一个类 TSocketBase public abstract class TSock ...

  2. OSGi 系列(七)之服务的监听、跟踪、声明等

    OSGi 系列(七)之服务的监听.跟踪.声明等 1. OSGi 服务的事件监听 和 bundle 的事件监听类似,服务的事件监听是在服务注册.注销,属性被修改的时候,OSGi 框架会发出各种不同的事件 ...

  3. OSGi 系列(三)之 bundle 事件监听

    OSGi 系列(三)之 bundle 事件监听 bundle 的事件监听是在 bundle 生命周期的不同状态相互转换时,OSGi 框架会发出各种不同的事件供事先注册好的事件监听器处理. 1. 事件监 ...

  4. Socket(TCP)客户端请求和服务端监听和链接基础(附例子)

    一:基础知识回顾 一: Socket 类 实现 Berkeley 套接字接口. Socket(AddressFamily, SocketType,ProtocolType) 使用指定的地址族.套接字类 ...

  5. Web重温系列(三):OracleDependency实现监听数据库变化

    有个小项目(后来由另一个小组以Java开发了),内容是监控一个Oracle数据库.如果其中一个表A有数据变动,则需要将相关内容重组后通过接口发送给B. 通常的解决办法是定时查询,时间间隔可以小一点,还 ...

  6. Oracle 本地创建多个实例并创建多个监听(只能在服务端弄,不可在客户端)

    注意:监听必须在客户端创建,在客户端创建,会报错. 1.创建监听 通过 Net Configuration Assistant  创建监听,设置端口: 注意:此监听创建完后,服务列表里面并没有此服务的 ...

  7. e814. 创建一个可监听选择状态的菜单项

    A menu item can receive notification of selection changes by overriding its menuSelectionChanged() m ...

  8. apache 创建多端口监听

    httpd.conf 将 #LoadModule vhost_alias_module modules/mod_vhost_alias.so 改为 LoadModule vhost_alias_mod ...

  9. Python基础系列讲解——TCP协议的socket编程

    前言 我们知道TCP协议(Transmission Control Protocol, 传输控制协议)是一种面向连接的传输层通信协议,它能提供高可靠性通信,像HTTP/HTTPS等网络服务都采用TCP ...

随机推荐

  1. [leetcode 48] rotate image

    1 题目 You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwi ...

  2. MediaWiki安装与配置(Ubuntu 10.4)

    实验室准备发布一个网站,本来是准备外包给别人做的,后来自己调研了一下,发现也没有想象的复杂和困难,于是最近一周自己吭哧吭哧地把网站搭好了. 之所以使用Mediawiki,一是考虑到是以实验室发布,不想 ...

  3. SQL入门经典(二) 之数据库基本查询、添加、更新和删除

    使用SQL查询: SQL查询基本语法: SELECT [ALL|DISTINCT]  [TOP (<expression>) [PERCENT] [WITH TIES] ] <col ...

  4. Android度量单位说明(DIP,DP,PX,SP) (转帖)

    (一)概念 dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不 ...

  5. [Xamarin] 從Xamarin中呼叫 *.jar 的 library -建立.jar篇 (转帖)

    嗯,這篇我們來聊聊如何從Xamarin 中來呼叫,已經包好的.jar ,首先因為要讓測試順利,我們開一個Android Java 的專案 當然是Eclipse ,然後我們簡簡單單寫一個測試用的libr ...

  6. CSS Font知识整理总结

    1.什么是字体 字体是文字的外在形式,就是文字的风格,是文字的外衣.比如行书.楷书.草书,都是一种字体.同样一个字每个人写起来都会有差异,可以说每个人都有一套潜在的字体库.对于web页面来说,字体就是 ...

  7. .net开发笔记(十二) 设计时与运行时的区别(续)

    上一篇博客详细讲到了设计时(DesignTime)和运行时(RunTime)的概念与区别,不过没有给出实际的Demo,今天整理了一下,做了一个例子,贴出来分享一下,巩固前一篇博客讲到的内容. 简单回顾 ...

  8. 如何用django开发一个简易个人Blog

    功能概要:(目前已实现功能) 公共展示部分: 1.网站首页展示已发布的博客记录,包括名称.摘要信息.发布日期.阅读量及评论数. 2.首页文章列表可按照分类筛选. 3.点击标题或阅读全文链接,进入博客阅 ...

  9. NanoProfiler - 适合生产环境的性能监控类库 之 基本功能篇

    背景 NanoProfiler是一个EF Learning Labs出品的免费性能监控类库(即将开源).它的思想和使用方式类似于MiniProfiler的.但是,设计理念有较大差异. MiniProf ...

  10. Bootstrap~多级导航(级联导航)的实现

    回到目录 在bootstrap官方来说,导航最多就是两级,两级以上是无法实现的,大叔找了一些第三方的资料,终于找到一个不错的插件,使用上和效果上都还不错,现在和大家分享一下 插件地址:http://v ...