【发布时间】:2011-06-01 13:25:39
【问题描述】:
我有一个带有服务器和客户端的简单 tcp/ip 聊天程序。我第一次发送数据包时,它会发送到客户端,但在 NetworkStream.Read 期间它会停止执行并且不会引发异常。我发送的下一个数据包被完美地读取和处理。我注意到的另一件奇怪的事情是 MyNetworkStream.DataAvailable 总是错误的,即使我从服务器获取信息,所以我必须放置一个调试符号并跳过它。我希望我可以发布我所有的代码,但它很长,所以我会发布我在网络流中读写的位置。
public void Listen(int byteLength)
{
var buffer = new byte[byteLength];
MySocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Read), buffer);
}
private void Read(IAsyncResult ar)
{
while (MySocket.Connected)
{
MyNetworkStream = new NetworkStream(MySocket);
var buffer = new byte[((byte[])ar.AsyncState).Length];
if (!MyNetworkStream.DataAvailable)
throw new Exception("Data not available");
MyNetworkStream.Read(buffer, 0, buffer.Length); <------Here it stops execution without throwing an exception
string content = Encoding.ASCII.GetString(buffer);
if(OnRead == null)
continue;
var e = new CommandEventArgs( null, content);
Control target = null;
if (OnRead.Target is Control)
target = (Control)OnRead.Target;
if (target != null && target.InvokeRequired)
target.Invoke(OnRead, this, e);
else
OnRead(this,e);
}
}
public void Write(string message)
{
try
{
var buffer = Encoding.ASCII.GetBytes(message);
MySocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, null, null);
if (OnWrite != null)
{
var target = (Control)OnWrite.Target;
if (target != null && target.InvokeRequired)
{
target.Invoke(OnWrite, this, new EventArgs());
}
else
{
OnWrite(this, new EventArgs());
}
}
}
catch
{
}
}
【问题讨论】:
-
关于 TCP 的一件重要的事情是它以流的形式而不是以数据包的形式传递数据。一个 Write 调用可能会分段到达,多个 write 调用可能一起到达。