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. )
  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. );
  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

我们看到收到了一个连接

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. Ubuntu Desktop开发生产环境搭建

    Ubuntu Desktop开发生产环境搭建 1   开发生产环境搭建 在本节内容开始前,先定义一下使用场合,没有哪种系统或者设备是万能的,都有它的优点和缺点,能够在具体的使用场景,根据自身的需求来取 ...

  2. Nim教程【十四】

    网友@沉没捕鱼,赞助了一台服务器 这个系列的教程写完之后,我们就要开始着手搭建Nim的社区了~ 异常 Nim中的异常类型是对象类型 根据惯例,Nim中的异常类型的命名都应该以Error后缀结尾 在sy ...

  3. java实现输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

    package JingDian; import java.util.Scanner; public class charKind { public static void main(String[] ...

  4. [Unity3D]做个小Demo学习Input.touches

    [Unity3D]做个小Demo学习Input.touches 学不如做,下面用一个简单的Demo展示的Input.touches各项字段,有图有真相. 本项目已发布到Github,地址在(https ...

  5. HTML5触屏版多线程渲染模板技术分享

    前言: 了解js编译原理的屌丝们都知道,js是单线程的,想当年各路神仙为了实现js的多线程,为了解决innerHTML输出大段HTML卡页面的顽疾,纷纷设计了诸如假冒的“多线程“实现,我自己也在写开源 ...

  6. Google 新推出Background sync API

    Background sync是Google新推出的Web API,可延迟用户行为,直到用户网络连接稳定.这样有助于保证用户想要发送的数据就是实际发送的数据. 目前存在的问题 网络是消磨用户时间最多的 ...

  7. JavaBean和Map转换封装类

    package com.ljq.util; import java.beans.BeanInfo; import java.beans.Introspector; import java.beans. ...

  8. Linux创建用户(转)

    这篇文章总结的太好了,让我没动力新写一篇了,啊哈哈哈哈. 源自:http://www.cnblogs.com/ylan2009/articles/2321177.html Linux 系统是一个多用户 ...

  9. Android 数据传递(二)Activity与fragment之间的通信

    在网上找到了一篇总结的非常好的文章,我这里就贴出他的博文地址.自己就不再写这个方面的总结了. Activity与Fragment通信(99%)完美解决方案

  10. Thrift架构~动态Thrift插件的注入

    先说AOP 说到注入,大家就会想起来IoC和AOP,确实如些,这一讲中,我们通过unity来实现对thrift插件的动态注入,事实上,这个功能在以后的项目中经常要用到,比如,你将一些功能分发到指定服务 ...