大家好:
最近我做了一个socket程序,遇到了一个奇怪的问题,希望大家给我提点意见。
因为是对服务器进行测试,我必须在客户端模拟多用户进行访问。
多用户连接服务器没有问题,所以我就直接就发送与接收两个方面向大家咨询意见。 发送指令,用的是同步方式,用了多线程,如下:
int num=0;
Thread[] ThreadTest = new Thread[3];
Socket[] sock = new Socket[20];
Socket[] client = new Socket[20];
string RecContent = string.Empty;
private const int BufferSize = 256;
private byte[] buffer = new byte[BufferSize]; private void ThreadStartReg()
{
try
{
Encoding en = System.Text.Encoding.UTF8;
byte[] lt = en.GetBytes("命令");
sock[num].Send(lt, lt.Length, 0);
}
catch { }
} private void btn_Command_Test_Click(object sender, EventArgs e) //按钮事件,发送命令
{
for (int i = 0; i < 3; i++)
{
num = i;
ThreadTest[i] = Thread(new ThreadStart(ThreadStartReg));
ThreadTest[i].Start();
}
} 接收用的是异步:
private void btn_SearchInfo_Click(object sender, EventArgs e)
{
for (int i = 0; i <3; i++)
{
num = i;
ReceiveData(i);
Thread.Sleep(2000);
if (RecContent != "")
{
rtbReceive.Text += "\r\n" + "客户端 " + (i + 1) + "\r\n";
rtbReceive.AppendText(RecContent); //向控件rtbReceive装载反馈数据
}
RecContent = "";
}
} private void ReceiveData(int i)
{
try
{
sock[i].BeginReceive(buffer, 0, BufferSize, SocketFlags.None, new AsyncCallback (ReceiveCallBack), sock[i]);
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
} private void ReceiveCallBack(IAsyncResult ar)
{
client[num] = (Socket)ar.AsyncState;
try
{
int bytesRead =client[num].EndReceive(ar);//结束挂起的异步读取。返回接收到的字节数。
if (bytesRead > 0)
{
string content = Encoding.UTF8.GetString(buffer, 0, bytesRead); //转换为字符串
client[num].BeginReceive(buffer, 0, BufferSize, 0, new AsyncCallback(ReceiveCallBack), client[num]);
RecContent += content;
}
else
{
client[num].Shutdown(SocketShutdown.Both);
client[num].Close();
}
}
catch (Exception ex)
{
MessageBox.Show(this, ex.Message, "Unusual error druing Recieve!");
}
}
其中,当服务器返回给客户端的内容较长时,长度大概在7000以上,在模拟多用户时,只能返回服务器给客户端1的数据,其他客户端都接收不到。当服务器返回给客户端的内容不长时,几个客户端都能收到,什么原因,跪求解决!!!!!!!
最近我做了一个socket程序,遇到了一个奇怪的问题,希望大家给我提点意见。
因为是对服务器进行测试,我必须在客户端模拟多用户进行访问。
多用户连接服务器没有问题,所以我就直接就发送与接收两个方面向大家咨询意见。 发送指令,用的是同步方式,用了多线程,如下:
int num=0;
Thread[] ThreadTest = new Thread[3];
Socket[] sock = new Socket[20];
Socket[] client = new Socket[20];
string RecContent = string.Empty;
private const int BufferSize = 256;
private byte[] buffer = new byte[BufferSize]; private void ThreadStartReg()
{
try
{
Encoding en = System.Text.Encoding.UTF8;
byte[] lt = en.GetBytes("命令");
sock[num].Send(lt, lt.Length, 0);
}
catch { }
} private void btn_Command_Test_Click(object sender, EventArgs e) //按钮事件,发送命令
{
for (int i = 0; i < 3; i++)
{
num = i;
ThreadTest[i] = Thread(new ThreadStart(ThreadStartReg));
ThreadTest[i].Start();
}
} 接收用的是异步:
private void btn_SearchInfo_Click(object sender, EventArgs e)
{
for (int i = 0; i <3; i++)
{
num = i;
ReceiveData(i);
Thread.Sleep(2000);
if (RecContent != "")
{
rtbReceive.Text += "\r\n" + "客户端 " + (i + 1) + "\r\n";
rtbReceive.AppendText(RecContent); //向控件rtbReceive装载反馈数据
}
RecContent = "";
}
} private void ReceiveData(int i)
{
try
{
sock[i].BeginReceive(buffer, 0, BufferSize, SocketFlags.None, new AsyncCallback (ReceiveCallBack), sock[i]);
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
} private void ReceiveCallBack(IAsyncResult ar)
{
client[num] = (Socket)ar.AsyncState;
try
{
int bytesRead =client[num].EndReceive(ar);//结束挂起的异步读取。返回接收到的字节数。
if (bytesRead > 0)
{
string content = Encoding.UTF8.GetString(buffer, 0, bytesRead); //转换为字符串
client[num].BeginReceive(buffer, 0, BufferSize, 0, new AsyncCallback(ReceiveCallBack), client[num]);
RecContent += content;
}
else
{
client[num].Shutdown(SocketShutdown.Both);
client[num].Close();
}
}
catch (Exception ex)
{
MessageBox.Show(this, ex.Message, "Unusual error druing Recieve!");
}
}
其中,当服务器返回给客户端的内容较长时,长度大概在7000以上,在模拟多用户时,只能返回服务器给客户端1的数据,其他客户端都接收不到。当服务器返回给客户端的内容不长时,几个客户端都能收到,什么原因,跪求解决!!!!!!!
{
num = i; // 走完循环后num值一直保持为2,所有的ReceiveData里面的num一直为2
ThreadTest[i] = Thread(new ThreadStart(ThreadStartReg));
ThreadTest[i].Start();
}
{
num = i; // 走完循环后num值一直保持为2,所有的ReceiveData里面的
ThreadTest[i] = Thread(new ThreadStart(ThreadStartReg));
ThreadTest[i].Start();
} ////////////////////你试试下面这个
int num=0;
Thread[] ThreadTest = new Thread[3];
Socket[] sock = new Socket[20];
Socket[] client = new Socket[20];
string RecContent = string.Empty;
private const int BufferSize = 256;
private byte[] buffer = new byte[BufferSize];
private const int MAX_BUFFER_SIZE = 1<<20;private void ThreadProc(object statenum)
{
int num = (int) statenum;
int i = num;
byte[] buffer = new byte[MAX_BUFFER_SIZE];
Encoding en = System.Text.Encoding.UTF8;
byte[] lt = en.GetBytes("命令");
sock[num].Send(lt, lt.Length, 0); // 同步访问应该最好同步接收
int bytesreceived = sock[num].Receive(buffer, 0, MAX_BUFFER_SIZE);
string s = Encoding.UTF8.GetString(buffer, 0, bytesreceived);
s = "\r\n" + "客户端 " + (i + 1) + "\r\n" + s;
this.Invoke(new d(this.ShowResult), new object[]{s}); // 利用这个函数转到UI线程
}private delegate void d(string s);private void ShowResult(string s)
{
if (s != null)
{
rtbReceive.Text += "\r\n" + "客户端 " + (i + 1) + "\r\n";
rtbReceive.AppendText(s); //向控件rtbReceive装载反馈数据
}
} private void btn_Command_Test_Click(object sender, EventArgs e) //按钮事件,发送命令
{
for (int i = 0; i < 3; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(this.ThreadProc), (System.Int32)i);
}
}