void ShowMsg()
{
while (true)
{
byte[] bytes = new byte[1024 * 1024 * 3]; //3M
for(int i=0;i<dic.Count;i++)
{
Socket socket = dic.Values.ElementAt(i);
int length = socket.Receive(bytes);
if (length > 0)
{
string Msg = System.Text.Encoding.UTF8.GetString(bytes, 0, length);
txtReceive.AppendText(dic.Keys.ElementAt(i) + " --- " + Msg + "\r\n");
}
}
}
}
ShowMsg是一个线程。
dic是一个字典,其中的Values值为所有客户端的Socket。for循环的意思是检测所有的Socket,如果收到数据则将数据取出来。
故障如下:当只有一个客户端时,没有问题,发什么,收什么。当客户端超过两个时,麻烦来了,客户端一发送后,服务器端没反应,这时只要客户端二发送信息,服务器会将客户端二的信息收到,而且将之前客户端一的信息收到。
我不清楚是不是因为for循环在线程里导致出现这种情况,还是因为什么,总感觉for循环没有完整的执行。
请教大家,谢谢!
{
while (true)
{
byte[] bytes = new byte[1024 * 1024 * 3]; //3M
for(int i=0;i<dic.Count;i++)
{
Socket socket = dic.Values.ElementAt(i);
int length = socket.Receive(bytes);
if (length > 0)
{
string Msg = System.Text.Encoding.UTF8.GetString(bytes, 0, length);
txtReceive.AppendText(dic.Keys.ElementAt(i) + " --- " + Msg + "\r\n");
}
}
}
}
ShowMsg是一个线程。
dic是一个字典,其中的Values值为所有客户端的Socket。for循环的意思是检测所有的Socket,如果收到数据则将数据取出来。
故障如下:当只有一个客户端时,没有问题,发什么,收什么。当客户端超过两个时,麻烦来了,客户端一发送后,服务器端没反应,这时只要客户端二发送信息,服务器会将客户端二的信息收到,而且将之前客户端一的信息收到。
我不清楚是不是因为for循环在线程里导致出现这种情况,还是因为什么,总感觉for循环没有完整的执行。
请教大家,谢谢!
解决方案 »
- C# winform的几个问题,多线程,匿名委托,菜鸟求指导
- 为什么无法退出,页面只是刷新了一下,为什么?
- 在datatable里追加相同表结构的datatable1
- C#从文件中读取一个整数
- C#语法问题
- 用C#判断排班的时间段
- tabcontrol如何根据page的text值来判断page是否存在?
- 如何给页面中每个显示的字符后面加上隐藏的“1”?
- 用OWC组件做柱状图,需要显示不同颜色的柱状以及显示不同颜色的图例
- 请教有用过水晶报表的高手,你们是怎么打印水晶报表的,直接打印页面吗(但是这样的话水晶报表的导航要怎么去掉呢),或都有什么更好的办
- 线程中变量释放问题,在线等
- UDP小测试,这里为何停住了?
客户端一发送没反应,可能是for的阻塞正好还在客户端二的socket.Receive停留着
我不知道“阻塞”是怎样产生的,应该怎样去避免呢?
http://bbs.csdn.net/topics/390518338
一楼的代码是循环所有与客户端连接的Socket,检测是否有数据发送至服务器端,可惜产生了阻塞不知道如何处理。
谢谢。
Socket.Receive方法 是一个阻塞的方法
当没有接受到数据的时候 程序运行到这里就停止了
一直等到能够接收到数据 这个程序才会继续走下去你用for(int i)
{
Socket[i].Receive
}
是肯定会造成这种问题的
因为例如 i = 1的时候 就是第一个Socket 开始接收 但是没接收到的时候就会卡住在这里
所以会造成 i = 2 的 Socket 没有调用这个方法解决方法 要不就每个Socket单独开个线程来 Receive
要不就 BeginReceive 异步来接收
既然某一个Socket.Receive可能造成阻塞 那么其他的Socket.Receive就调用不了 所以就应该每个Socket对应一个线程(或者使用异步编程) 不能把所有的socket.Receive放在一个线程中去 参见#4
try{
Socket socket = listener.Accept();//此线程将在此监听
CClient cClient = new CClient(socket);
Thread thread = new Thread(new ThreadStart(cClient.WaitForSendData));
thread.Name = socket.RemoteEndPoint.ToString();
thread.Start();
}
类CClient public void WaitForSendData()
{
try
{
while (thisSocket != null)
{ if (thisSocket.Connected == false)
{
break;
}
string data = string.Empty;
bytes = new byte[1024];
thisSocket.Blocking = true;
int bytesRec = 0; if (thisSocket.Available == 0)
{
Thread.Sleep(500);
continue;
}
。
{
socket_Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
string HostName = Dns.GetHostName();
IPHostEntry IpEntry = Dns.GetHostEntry(HostName);
string strIpAddr = IpEntry.AddressList[0].ToString();
IPAddress ServerIP = IPAddress.Parse(strIpAddr);
int port = 9001;
IPEndPoint point = new IPEndPoint(ServerIP, port);
socket_Server.Bind(point);
socket_Server.Blocking = false;
socket_Server.Listen(10);
txtBoxListenMsg.AppendText("监听成功!\r\n");
btnListen.Enabled = false;
AsyncCallback aCallback = new AsyncCallback(AcceptCallback);
socket_Server.BeginAccept(aCallback, socket_Server); }
public void AcceptCallback(IAsyncResult ar)
{
Socket listener = null;
Socket handler = null;
try
{
byte[] buffer = new byte[1024];
listener = (Socket)ar.AsyncState;
handler = listener.EndAccept(ar);
handler.NoDelay = false;
object[] obj = new object[2];
obj[0] = buffer;
obj[1] = handler;
handler.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), obj);
AsyncCallback aCallback = new AsyncCallback(AcceptCallback);
listener.BeginAccept(aCallback, listener);
}catch(Exception e){MessageBox.Show(e.ToString());}
}
public void ReceiveCallback(IAsyncResult ar)
{
try
{
object[] obj = new object[2];
obj = (object[])ar.AsyncState;
byte[] buffer = (byte[])obj[0];
Socket handler = (Socket)obj[1];
string content = string.Empty;
int bytesRead = handler.EndReceive(ar);
if (bytesRead > 0)
{
content += Encoding.Unicode.GetString(buffer, 0, bytesRead);
if (content.IndexOf("<Client Quit>") > -1)
{
string str = content.Substring(0, content.LastIndexOf("<Client Quit>"));
txtReceive.Text = str + "\t\n" + txtReceive.Text;
}
else
{
byte[] buffernew = new byte[1024];
obj[0] = buffernew;
obj[1] = handler;
handler.BeginReceive(buffernew, 0, buffernew.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), obj);
txtReceive.Text = content + " ----- " + handler.RemoteEndPoint.ToString() +"\t\n" + txtReceive.Text;
} }
}
catch (Exception e) { MessageBox.Show(e.ToString()); }
}