异步Socket的BeginReceive()方法里AsyncCallback方法里面为什么还要重新写BeginReceive()?
异步Socket的BeginAccpet()方法里AsyncCallback方法里面为什么还要重新写BeginAccpet()?
那BeginConnect()和BeginSend()是否有必要也得这么写?
请熟悉.net网络编程的GGMM告诉小弟下?
示例代码如下: public virtual void Start()
{
if (_isRun)
{
throw (new ApplicationException("TcpSvr已经在运行."));
}
_sessionTable = new Hashtable(1024);
_recvDataBuffer = new byte[DefaultBufferSize];
_svrSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, _port);
_svrSock.Bind(iep);
_svrSock.Listen(1024);
_svrSock.BeginAccept(new AsyncCallback(AcceptConn), _svrSock); _isRun = true;
} protected virtual void AcceptConn(IAsyncResult iar)
{
//如果服务器停止了服务,就不能再接收新的客户端
if (!_isRun)
{
return;
} //接受一个客户端的连接请求
Socket oldserver = (Socket)iar.AsyncState;
Socket client = oldserver.EndAccept(iar); //检查是否达到最大的允许的客户端数目
if (_clientCount == _maxClient)
{
if (ServerFull != null)
{
ServerFull(this, new NetEventArgs(new Session(client)));
}
}
else
{
//新建一个客户端连接
Session newSession = new Session(client);
_sessionTable.Add(newSession.ID, newSession); _clientCount++; newSession.RecvDataBuffer = new byte[16 * 1024];
//开始接受来自该客户端的数据
client.BeginReceive(newSession.RecvDataBuffer, 0, newSession.RecvDataBuffer.Length, SocketFlags.None,
new AsyncCallback(ReceiveData), newSession); //新的客户段连接,发出通知
if (ClientConn != null)
{
ClientConn(this, new NetEventArgs(newSession));
}
} //继续接受客户端
_svrSock.BeginAccept(new AsyncCallback(AcceptConn), _svrSock);
} protected virtual void ReceiveData(IAsyncResult iar)
{
Session sendDataSession = (Session)iar.AsyncState;
Socket client = sendDataSession.ClientSocket; try
{
//如果两次开始了异步的接收,所以当客户端退出的时候
//会两次执行EndReceive
int recv = client.EndReceive(iar); if (recv == 0)
{
CloseClient(client, Session.ExitType.NormalExit);
return;
} string receivedData = _coder.GetEncodingString(sendDataSession.RecvDataBuffer, recv);
//string receivedData = _coder.GetEncodingString(_recvDataBuffer, recv); //发布收到数据的事件
if (RecvData != null)
{
//Session sendDataSession = FindSession(client); Debug.Assert(sendDataSession != null); if (_resolver != null)
{
if (sendDataSession.Datagram != null && sendDataSession.Datagram.Length != 0)
{
receivedData = sendDataSession.Datagram + receivedData;
} string[] recvDatagrams = _resolver.Resolve(ref receivedData); foreach (string newDatagram in recvDatagrams)
{
ICloneable copySession = (ICloneable)sendDataSession;
Session clientSession = (Session)copySession.Clone(); string strDatagram = newDatagram;
//clientSession.ClassName = this.GetClassFullName(ref strDatagram);
clientSession.Datagram = strDatagram; //发布一个报文消息
RecvData(this, new NetEventArgs(clientSession));
} //剩余的代码片断,下次接收的时候使用
sendDataSession.Datagram = receivedData; if (sendDataSession.Datagram.Length > MaxDatagramSize)
{
sendDataSession.Datagram = null;
}
}
else
{
ICloneable copySession = (ICloneable)sendDataSession;
Session clientSession = (Session)copySession.Clone();
//clientSession.ClassName = this.GetClassFullName(ref receivedData);
clientSession.Datagram = receivedData; RecvData(this, new NetEventArgs(clientSession));
}
} //继续接收来自来客户端的数据
client.BeginReceive(sendDataSession.RecvDataBuffer, 0, sendDataSession.RecvDataBuffer.Length, SocketFlags.None,
new AsyncCallback(ReceiveData), sendDataSession);
}
catch (SocketException ex)
{
if (10054 == ex.ErrorCode)
{
//客户端强制关闭
CloseClient(client, Session.ExitType.ExceptionExit);
} }
catch (ObjectDisposedException ex)
{
if (ex != null)
{
ex = null;
//DoNothing;
}
}
}
异步Socket的BeginAccpet()方法里AsyncCallback方法里面为什么还要重新写BeginAccpet()?
那BeginConnect()和BeginSend()是否有必要也得这么写?
请熟悉.net网络编程的GGMM告诉小弟下?
示例代码如下: public virtual void Start()
{
if (_isRun)
{
throw (new ApplicationException("TcpSvr已经在运行."));
}
_sessionTable = new Hashtable(1024);
_recvDataBuffer = new byte[DefaultBufferSize];
_svrSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, _port);
_svrSock.Bind(iep);
_svrSock.Listen(1024);
_svrSock.BeginAccept(new AsyncCallback(AcceptConn), _svrSock); _isRun = true;
} protected virtual void AcceptConn(IAsyncResult iar)
{
//如果服务器停止了服务,就不能再接收新的客户端
if (!_isRun)
{
return;
} //接受一个客户端的连接请求
Socket oldserver = (Socket)iar.AsyncState;
Socket client = oldserver.EndAccept(iar); //检查是否达到最大的允许的客户端数目
if (_clientCount == _maxClient)
{
if (ServerFull != null)
{
ServerFull(this, new NetEventArgs(new Session(client)));
}
}
else
{
//新建一个客户端连接
Session newSession = new Session(client);
_sessionTable.Add(newSession.ID, newSession); _clientCount++; newSession.RecvDataBuffer = new byte[16 * 1024];
//开始接受来自该客户端的数据
client.BeginReceive(newSession.RecvDataBuffer, 0, newSession.RecvDataBuffer.Length, SocketFlags.None,
new AsyncCallback(ReceiveData), newSession); //新的客户段连接,发出通知
if (ClientConn != null)
{
ClientConn(this, new NetEventArgs(newSession));
}
} //继续接受客户端
_svrSock.BeginAccept(new AsyncCallback(AcceptConn), _svrSock);
} protected virtual void ReceiveData(IAsyncResult iar)
{
Session sendDataSession = (Session)iar.AsyncState;
Socket client = sendDataSession.ClientSocket; try
{
//如果两次开始了异步的接收,所以当客户端退出的时候
//会两次执行EndReceive
int recv = client.EndReceive(iar); if (recv == 0)
{
CloseClient(client, Session.ExitType.NormalExit);
return;
} string receivedData = _coder.GetEncodingString(sendDataSession.RecvDataBuffer, recv);
//string receivedData = _coder.GetEncodingString(_recvDataBuffer, recv); //发布收到数据的事件
if (RecvData != null)
{
//Session sendDataSession = FindSession(client); Debug.Assert(sendDataSession != null); if (_resolver != null)
{
if (sendDataSession.Datagram != null && sendDataSession.Datagram.Length != 0)
{
receivedData = sendDataSession.Datagram + receivedData;
} string[] recvDatagrams = _resolver.Resolve(ref receivedData); foreach (string newDatagram in recvDatagrams)
{
ICloneable copySession = (ICloneable)sendDataSession;
Session clientSession = (Session)copySession.Clone(); string strDatagram = newDatagram;
//clientSession.ClassName = this.GetClassFullName(ref strDatagram);
clientSession.Datagram = strDatagram; //发布一个报文消息
RecvData(this, new NetEventArgs(clientSession));
} //剩余的代码片断,下次接收的时候使用
sendDataSession.Datagram = receivedData; if (sendDataSession.Datagram.Length > MaxDatagramSize)
{
sendDataSession.Datagram = null;
}
}
else
{
ICloneable copySession = (ICloneable)sendDataSession;
Session clientSession = (Session)copySession.Clone();
//clientSession.ClassName = this.GetClassFullName(ref receivedData);
clientSession.Datagram = receivedData; RecvData(this, new NetEventArgs(clientSession));
}
} //继续接收来自来客户端的数据
client.BeginReceive(sendDataSession.RecvDataBuffer, 0, sendDataSession.RecvDataBuffer.Length, SocketFlags.None,
new AsyncCallback(ReceiveData), sendDataSession);
}
catch (SocketException ex)
{
if (10054 == ex.ErrorCode)
{
//客户端强制关闭
CloseClient(client, Session.ExitType.ExceptionExit);
} }
catch (ObjectDisposedException ex)
{
if (ex != null)
{
ex = null;
//DoNothing;
}
}
}
解决方案 »
- C# 使用html超链接,链接到本地文件问题
- 重载与委托不匹配 C# winform
- 请教confirm的问题
- c# treeview获取所选节点中子节点的个数,出现了奇怪的问题!!
- 如何写一个服务禁用OutLook的对话框提示的弹出?
- 关于调用本地的应用程序打开服务器上问题
- 线程方面的问题..急!!!!
- C#中s=TCPlistener.AcceptSocket()d的错误
- 实现常驻内存的程序
- 如何在c#中使用CrystalReportViewer控件?(半天结帖!)
- 询问 SuppressFinalize 方法[并忙解释]
- DataTable的DateTime字段DBNull.Value序列化传送到客户端到变成0001-01-01
一个服务器端总不可能只允许一个用户连进来吧,不重新写BeginAccpet(),那其他用户连怎么连进来?
数据接收总不可能一次性接收完毕吧,一个数据包大小有限,最多就1千多个字节,不重新写BeginReceive(),那后续的数据不要接收了吗?