每个人,我正在尝试编写一个循环来从后台线程中的连接套接字读取。但它只收到第一条消息。我找了一会儿找到原因。但仍然无法弄明白。我知道有些人遇到了同样的问题。但是,他们的原因似乎不同。我希望有人能帮助我。
private void setPort_Click(object sender, EventArgs e)
{
SetupTcpListener = new Task(() =>
{
try
{
Int32 Port;
Int32.TryParse(portNum.Text, out Port);
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
server = new TcpListener(localAddr, Port);
server.Start(10);
Tclient = server.AcceptTcpClient();
Console.WriteLine("Connected");
}
catch (SocketException exc)
{
Console.WriteLine("SocketException: {0}", exc);
}
NetworkStream tstream = Tclient.GetStream();
int t = 0;
while (true)//the first loop: WriteLine a signal when read sth
//read first message:"Get 0"
//read second message:"Get 1"
//and so on
{
t++;
int i = 0;
while (i <= 0)//the second loop is trying to read until get sth.
//when it get sth, the first while loop continue,and print a "Get t"
//t means how many times it has read a messsage.
{
i = tstream.Read(ReadBuffer,0,40);
}
Console.WriteLine("Get "+ t.ToString());
}
});
SetupTcpListener.Start();
}
答案 0 :(得分:2)
从这一行可以看出你只读一个字节的原因:
int i = 0;
while (i <= 0)
{
i = tstream.Read(ReadBuffer,0,40);
}
NetworkStream.Read返回从套接字读取的字节数。因此,只要您收到超过1个字节,就会终止循环。
话虽这么说,我可以看到你的代码存在多个问题,例如你如何编写循环来从套接字中读取字节(为什么要在这里嵌套循环?),如何打印结果收到的字节(你不断打印t,这意味着你会得到“0”),特别是你的操作完成后如何关闭套接字。
此外,如果您使用Winforms(因为这是点击事件的一部分),使用backgroundworker可能更适合您的情况。
我建议您阅读几个如何正确完成套接字编程的示例,例如来自this site。
答案 1 :(得分:2)
这很奇怪:
while (true)
{
t++;
int i = 0;
while (i <= 0)
{
i = tstream.Read(ReadBuffer,0,40); //now i>0 so quit the loop
}
Console.WriteLine("Get "+ t.ToString());
//but go around again anyway???
}
你的意思是:
while (true)
{
var amtRead = tstream.Read(ReadBuffer,0,40);
//or even safer
//var amtRead = tstream.Read(ReadBuffer, 0, ReadBuffer.Length);
if(amtRead == 0)
{
//other end is out of data. transfer is finished
break;
}
}
或者也许是你只接受一次连接。
或者也许是因为你永远覆盖了数组ReadBuffer
的0-39位而没有对数据做任何事情。
这完全取决于你所说的“消息”。