C# Socket系列一 简单的创建socket的监听
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的监听的更多相关文章
- C# Socket系列二 简单的创建 socket 通信
看了系列一 我们开启了对socket tcp的监听状态,那么这一章我们来讲解怎么创建socket的通信代码 我新建一个类 TSocketBase public abstract class TSock ...
- OSGi 系列(七)之服务的监听、跟踪、声明等
OSGi 系列(七)之服务的监听.跟踪.声明等 1. OSGi 服务的事件监听 和 bundle 的事件监听类似,服务的事件监听是在服务注册.注销,属性被修改的时候,OSGi 框架会发出各种不同的事件 ...
- OSGi 系列(三)之 bundle 事件监听
OSGi 系列(三)之 bundle 事件监听 bundle 的事件监听是在 bundle 生命周期的不同状态相互转换时,OSGi 框架会发出各种不同的事件供事先注册好的事件监听器处理. 1. 事件监 ...
- Socket(TCP)客户端请求和服务端监听和链接基础(附例子)
一:基础知识回顾 一: Socket 类 实现 Berkeley 套接字接口. Socket(AddressFamily, SocketType,ProtocolType) 使用指定的地址族.套接字类 ...
- Web重温系列(三):OracleDependency实现监听数据库变化
有个小项目(后来由另一个小组以Java开发了),内容是监控一个Oracle数据库.如果其中一个表A有数据变动,则需要将相关内容重组后通过接口发送给B. 通常的解决办法是定时查询,时间间隔可以小一点,还 ...
- Oracle 本地创建多个实例并创建多个监听(只能在服务端弄,不可在客户端)
注意:监听必须在客户端创建,在客户端创建,会报错. 1.创建监听 通过 Net Configuration Assistant 创建监听,设置端口: 注意:此监听创建完后,服务列表里面并没有此服务的 ...
- e814. 创建一个可监听选择状态的菜单项
A menu item can receive notification of selection changes by overriding its menuSelectionChanged() m ...
- apache 创建多端口监听
httpd.conf 将 #LoadModule vhost_alias_module modules/mod_vhost_alias.so 改为 LoadModule vhost_alias_mod ...
- Python基础系列讲解——TCP协议的socket编程
前言 我们知道TCP协议(Transmission Control Protocol, 传输控制协议)是一种面向连接的传输层通信协议,它能提供高可靠性通信,像HTTP/HTTPS等网络服务都采用TCP ...
随机推荐
- [ASE][Daily Scrum]11.27
View Shilin Liu 设计死亡处理 Yiming Liao 处理tank-子弹碰撞事件 Server Songtao He 修复子弹队列满时的bug Junbei Zhang 服务器 ...
- Entity FrameWork 单表对多实体
一个影片信息Clips表,四个字段:clipId,clipName,fileSize,fileName 方案一: [Table("Clips")] public class Cli ...
- Twitter全局唯一ID生成算法
测试:private static void TestIdWorker() { HashSet<long> set = new HashSet<long>(); IdWorke ...
- Java多线程5:synchronized锁方法块
synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用 ...
- OpenCV 3.0函数库索引
================================== 前言:值的个数: cvCrossProduct:计算两个三维向量的向量积(叉积): cvCvtColor:将数组的通道从一个颜色空 ...
- ComponentOne 2016 年产品规划
作为老牌的 Visual Studio 控件集,ComponentOne 今后的发展方向是什么?新的一年会在哪些方面有所增强?且听 ComponentOne 全球产品经理的 2016年规划. 2016 ...
- java.util.Properties
1 Properties文件中分隔符及空格的处理 因为 Properties 继承于 Hashtable,所以可对 Properties 对象应用 put 和 putAll 方法.但强烈反对使用这两个 ...
- Java基础之泛型
泛型: (1)为什么会出现泛型? 因为集合存放的数据类型不固定,故往集合里面存放元素时,存在安全隐患, 如果在定义集合时,可以想定义数组一样指定数据类型,那么就可以解决该类安全问题. JDK1.5后出 ...
- Redis服务器的启动过程分析
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/127.html?1455808771 本文将通过分析代码来介绍Redis的 ...
- Linux~centos上安装.netcore,HelloWorld归来!
对于跨平台的.netCore来说,让它的程序运行在Linux系统上已经成为必然,也是一种趋势,毕竟我们的很多服务都放在linux服务器上(redis,mongodb,myql,fastDFS,luce ...