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