客户端代码:
IPHostEntry ipHostEntry = Dns.Resolve(this.txtComputerName.Text);
IPEndPoint ipEndPoint = new IPEndPoint(ipHostEntry.AddressList[0], 10000);Socket socket = new System.Net.Sockets.Socket(ipEndPoint.Address.AddressFamily,SocketType.Stream,ProtocolType.Tcp);
try
{
   socket.Connect(ipEndPoint);
}
catch (Exception exp)
{
   MessageBox.Show("Exception Thrown: " + exp.ToString());
}

byte[] msg = Encoding.ASCII.GetBytes(this.txtSendMsg.Text);// Blocks until send returns.
int i = socket.Send(msg, 0, msg.Length, SocketFlags.None);// Blocks until read returns.
byte[] bytes = new byte[1024];
socket.Receive(bytes, 0, socket.Available, SocketFlags.None);this.txtReceiveMsg.Text = Encoding.ASCII.GetString(bytes);
socket.Shutdown(SocketShutdown.Both);
socket.Close();服务器端:
socket = tcpListener.AcceptSocket();
ReadClass readClass = new ReadClass(socket);
Thread thread = new Thread(new ThreadStart(readClass.Run));
thread.Start();
threads.Add(thread);
byte[] bytes = new byte[255];
socket.Receive(bytes);
string msg = "OK-" + Format(bytes);
socket.Send(Encoding.ASCII.GetBytes(msg));
socket.Close();
socket = null;在运行时,服务器端还没有向客户端回发消息的时候,客户端的socket.Receive语句已经执行完毕了,导致了txtReceiveMsg控件显示为空,若将socket.Receive语句改成下列语句,则系统没有空值返回了.
    while (socket.Receive(bytes, 0, socket.Available, SocketFlags.None)==0);
请问这是什么原因?如何避免?因为while循环总是不好.

解决方案 »

  1.   

    // Blocks until read returns.
    byte[] bytes = new byte[1024];
    socket.Receive(bytes, 0, socket.Available, SocketFlags.None);问题出在这里。客户端刚刚发送完毕,就去读“socket.Available”了,那时候,不要说服务器的消息没法送过来,可能客户端发送的包裹还在网线里呢。将socket.Available改成1024,然后用另一个变量接收 Receive 的返回值:byte[] bytes = new byte[1024];
    int read = socket.Receive(bytes, 0, 1024, SocketFlags.None);虽然 Receive 是阻塞模式,但是仅当没有数据可读的时候阻塞。一旦有数据了,就会立即返回,并且用返回值(上例用int read接收了)告诉你实际上接收了多少个字节的数据。然后就可以用 Encoding.ASCII.GetString(bytes, 0, read) 来截取read长度的字节数组,构造ASCII字符串。