客户端代码:
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循环总是不好.
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循环总是不好.
解决方案 »
- 请问该程序怎么出错了,怎么改?调试时显示ORA-00911: invalid character,但是这个查询语句在数据库里是正确的
- C# winfrom textbox中文字如何垂直居中
- datatable创建行,并为行赋值(列已固定)
- *********FTP文件上传问题***********
- c# 写入文件线程问题
- nhibernate+wcf分布式事务,The transaction has aborted
- 聊天工具,为了能支持局域网到另一个局域网之间的通讯,服务器要帮这二个客户端传输哪些信息,做哪些事情
- DataGirdView怎么能绑定到远程服务器呢
- 设定共享文件夹及其共享权限
- 代码理解系列问题1
- 请教socket问题(郁闷)
- c# 的版本号?
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字符串。