C#异步套接字服务器接收问题
我在这里实现了关于这篇文章的服务器应用程序:
http://www.codeguru.com/csharp/csharp/cs_network/sockets/article.php/c8781#Client1
总结:我正在使用异步套接字ala BeginAccept(..),BeginReceive(..). 这是WaitForData(..)& OnDataReceive(..)我在服务器中实现的方法 public void WaitForData(MyClient client) { try { if (pfnCallBack == null) { pfnCallBack = new AsyncCallback(OnDataReceived); } iarResult = client.Socket.BeginReceive(client.DataBuffer,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,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); } } 客户端调用同步SEND METHOD TWICE或更多!服务器INSTANCEOF 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()); } 所以,我认为这段代码片段必须足以让你得到我试图使用的想法! 感谢名单! 解决方法
TCP是基于流的,而不是基于消息的. One Read可以包含以下任何替代方案:
>消息的一小部分 因此,您需要使用某种方法来查看是否已到达完整的消息.最常见的方法是: >添加一个页脚(例如一个空行),表示消息结束 更新 简单示例只有标题长度. 服务器端: var buffer = binaryFormmater.Serialize(myobj); var length = buffer.Length; networkStream.Send(length); networkStream.Send(buffer,buffer.Length); 客户端: var header = new buffer[4]; // TODO: You need to make sure that 4 bytes have been read. networkStream.Read(header,4); var length = BitConverter.ToInt32(buffer); var readbuffer= new byte[65535]; var bytesLeft = length; var messageStream = new MemoryStream(); while (bytesLeft > 0) { var read = networkStream.Read(readbuffer,bytesLeft); messageStream.Write(readbuffer,read); bytesLeft -= read,} messageStream.Seek(0,SeekOrigin.Begin); MyMessage msg = (MyMessage)binForm.Deserialize(messageStream); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |