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 ...
随机推荐
- C++混合编程之idlcpp教程Python篇(7)
上一篇在这 C++混合编程之idlcpp教程Python篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与PythonTutorial4工程相似,工程PythonTutorial5中,同 ...
- [leetcode 25]Reverse Nodes in k-Group
1 题目: Given a linked list, reverse the nodes of a linked list k at a time and return its modified li ...
- 再探@font-face及webIcon制作
@font-face 不能说他是什么新东西了,在 CSS2.0 规范中就有了这玩意儿,IE4.0 开始就已经出现,只是当时用的不是特别广泛,后来在 CSS2.1 草案中又被删掉.随着 web 的急速发 ...
- Java多线程系列--“JUC锁”07之 LockSupport
概述 本章介绍JUC(java.util.concurrent)包中的LockSupport.内容包括:LockSupport介绍LockSupport函数列表LockSupport参考代码(基于JD ...
- 【译】Activitys, Threads和 内存泄露
Android编程中一个共同的困难就是协调Activity的生命周期和长时间运行的任务(task),并且要避免可能的内存泄露.思考下面Activity的代码,在它启动的时候开启一个线程并循环执行任务. ...
- SQL Server 性能优化之——T-SQL 临时表、表变量、UNION
这次看一下临时表,表变量和Union命令方面是否可以被优化呢? 阅读导航 一.临时表和表变量 二.本次的另一个重头戏UNION 命令 一.临时表和表变量 很多数据库开发者使用临时表和表变量将代码分解成 ...
- 如何为编程爱好者设计一款好玩的智能硬件(十)——无线2.4G通信模块研究·一篇说完
六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...
- java数学函数库 API(转)
原文地址:http://www.24xuexi.com/w/2011-11-08/98206.html 首先给大家看看Math类所提供的主要方法,下面的列表给出了Math类的主要方法,如果要理解Mat ...
- knh
市场调研,分析—— 决定是否创业 不要再极度的沉默无言.宅.无存在感,无趣,难熬..
- iOS 打包iPa
http://blog.fir.im/how-to-build-adhoc-ipa/ 之前都是打包好ipa然后发送给客户,特麻烦,fir.im网站不错 迅速获取自己手机的udid: http://f ...