异步TCP连接服务器端

原创 2006年06月22日 16:21:00

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

    }

}

网络编程之TCP异步群聊:服务器端代码

最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档。于是我也觉的有这个必要。写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博客...

C#版异步TCP聊天服务器端简单代码示例

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin...
  • bjtbjt
  • bjtbjt
  • 2013年11月23日 18:54
  • 3762

Linux socket编程入门及客户端服务器端通信实现 – 提高篇:TCP连接过程分析

 ------------------------1  建立连接  ------------------------ 终端输入命令: ./tcpserv & ,使服务器端程序后台执...

在服务器端判断request来自Ajax请求(异步)还是传统请求(同步)

在一次做非常复杂的ajax应用时,如果一个会话已经超时,但是此时再通过ajax请求,那么ajax返回的则是一个登陆页面的html,那这下就惨了,页面上而已就乱了,那么,能否在java端,如拦截器里判断...

服务器端判断request是Ajax请求(异步)还是传统请求(同步)

在一次做非常复杂的ajax应用时,如果一个会话已经超时,但是此时再通过ajax请求,那么ajax返回的则是一个登陆页面的html,那这下就惨了,页面上而已就乱了,那么,能否在java端,如拦截器里判断...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:异步TCP连接服务器端
举报原因:
原因补充:

(最多只允许输入30个字)