我已经按照这篇文章中的说明实现了我的服务器应用程序:http://www.codeguru.com/csharp/csharp/cs_network/sockets/article.php/c8781#Client1
总结:我正在使用异步套接字(async Sockets),即BeginAccept(...),BeginReceive(...)。我的服务器能够处理多个客户端,并且一切都很正常,直到一个客户端执行了两个或更多同步发送操作而没有等待一段时间。客户端不会收到任何错误消息,也就没有得到通知,服务器没有收到第二条消息!如果客户端在第一次发送操作后等待大约100毫秒,一切都正常运行。我认为当我使用TCP时,可以确保服务器接收到消息(除非抛出异常)!你能提供一个解决方案来修复这个问题吗?
以下是我在服务器上实现的WaitForData(...) 和OnDataReceive(...) 方法。
客户端调用同步发送方法两次或更多次!服务器实例是MyClient。
以下是我在服务器上实现的WaitForData(...) 和OnDataReceive(...) 方法。
public void WaitForData(MyClient client)
{
try
{
if (pfnCallBack == null)
{
pfnCallBack = new AsyncCallback(OnDataReceived);
}
iarResult = client.Socket.BeginReceive(client.DataBuffer,
0, client.DataBuffer.Length,
SocketFlags.None,
pfnCallBack,
client);
}
catch (SocketException se)
{
MessageBox.Show("SocketException@WaitForData" + se.Message);
}
}
public void OnDataReceived(IAsyncResult asyn)
{
try
{
MyClient user= (MyClient)asyn.AsyncState;
int iRx = user.Socket.EndReceive(asyn);
byte[] receivedData = user.DataBuffer;
MemoryStream memStream = new MemoryStream();
BinaryFormatter binForm = new BinaryFormatter();
memStream.Write(receivedData, 0, receivedData.Length);
memStream.Seek(0, SeekOrigin.Begin);
MyMessage msg = (MyMessage)binForm.Deserialize(memStream);
switch (msg.Command)
{
case (MyMessage.MyCommand.ConnId):
this.connId = (int) msg.MyObject;
tsslConnStatus.Text += " | ID: " + connId.ToString();
break;
case (MyMessage.MyCommand.Text):
MessageBox.Show(msg.MyObject.ToString());
break;
}
WaitForData(server);
}
catch (ObjectDisposedException ode)
{
MessageBox.Show("ObjectDisposedException@OnReceiveData" + ode.Message);
}
catch (SocketException se)
{
MessageBox.Show("SocketException@OnReceiveData" + se.Message);
}
}
客户端调用同步发送方法两次或更多次!服务器实例是MyClient。
if (server.Socket.Connected)
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, message);
MyMessage = new MyMessage(something);
server.Socket.Send(ms.ToArray());
}
因此,我认为这些代码片段足以让您理解我试图使用的想法!如果您需要更多详细信息或代码片段,请告诉我,我会发布它!
谢谢!