异步TCP连接服务器端

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

    }

}
阅读更多
想对作者说点什么? 我来说一句

JDBC连接MYSQL数据库

-

学院

1970年01月01日 08:00

nio异步长连接服务端与客户端

2010年04月15日 12KB 下载

没有更多推荐了,返回首页

不良信息举报

异步TCP连接服务器端

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭