TcpTranslate 为传输辅助类,此外代码不全.待续.....
using
System;
using
System.IO;
using
System.Text;
using
System.Net;
using
System.Net.Sockets;
using
System.Collections.Generic;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
namespace
SocketServer
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 网络通讯事件模型委托
/// </summary>
/// <param name="sender"></param>
/// <param name="e">与客户端的连接类</param>
public delegate void NetEvent(object sender, TcpTranslate e);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 监听端口,接受多客户的TCP连接
/// </summary>
public class TcpServer
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
事件定义#region 事件定义
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 接收客户端连接事件
/// </summary>
public event NetEvent Connected;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 与客户端连接断开事件
/// </summary>
public event NetEvent DisConnect;
#endregion
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
字段#region 字段
private int _maxsockets = 1000; //最大客户连接数
private IPEndPoint _iep; //监听终结点
private TcpListener _listener; //监听类
private Dictionary<EndPoint, TcpTranslate> _session;
#endregion
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
属性#region 属性
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 当前客户连接数
/// </summary>
public int ConnectCount
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
get ...{ return _session.Count; }
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 与客户连接的所有Socket
/// </summary>
public Dictionary<EndPoint, TcpTranslate> Session
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
get ...{ return _session; }
}
#endregion
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
构造函数#region 构造函数
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="port">监听的端口号</param>
/// <param name="maxsocket">最大客户连接量</param>
public TcpServer(int maxsockets, string IP, int port)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_maxsockets = maxsockets;
_iep = new IPEndPoint(IPAddress.Parse(IP), port);
}
public TcpServer(int port)
: this(1000, "0.0.0.0", port)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
}
#endregion
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
公用方法#region 公用方法
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 启动服务器程序,开始监听客户端请求
/// </summary>
public void Start()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_session = new Dictionary<EndPoint, TcpTranslate>();
_listener = new TcpListener(_iep);
_listener.Start(10);
//监听客户端连接请求
_listener.BeginAcceptSocket(
new AsyncCallback(clientConnect), _listener);
}
private void clientConnect(IAsyncResult ar)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//接受客户的连接,得连接Socket
Socket _socket = _listener.EndAcceptSocket(ar);
TcpTranslate trans = new TcpTranslate(_socket);
trans.DisConnect += new NetEvent(trans_DisConnect);
//开始接受数据
trans.StartReceive();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//客户端连接成功事件
if (Connected != null) Connected(this, trans);
TcpTranslate.WriteLine(trans.RemoteEndPoint.ToString() + " is Connection...Num" + _session.Count.ToString());
if (_session.ContainsKey(trans.RemoteEndPoint))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_session[trans.RemoteEndPoint] = trans;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_session.Add(trans.RemoteEndPoint, trans);
}
if (ConnectCount < _maxsockets)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//继续监听客户端连接请求
_listener.BeginAcceptSocket(
new AsyncCallback(clientConnect), _listener);
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{ //达到最大连接客户数,则关闭监听.
_listener.Stop();
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//客户端断开连接
void trans_DisConnect(object sender, TcpTranslate trans)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//如果已关闭侦听器,则打开,继续监听
if (ConnectCount == _maxsockets)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_listener.Start(1);
_listener.BeginAcceptSocket(
new AsyncCallback(clientConnect), _listener);
}
_session.Remove(trans.RemoteEndPoint);
//触发客户断开事件
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (DisConnect != null) ...{ DisConnect(this, trans); }
TcpTranslate.WriteLine(trans.RemoteEndPoint.ToString() + " is DisConnect...Num" + _session.Count.ToString());
}
#endregion
}
}