我已经创建了一个简单的tcp侦听服务器,我从手机连接到该服务器来控制我的天花板灯。但有时它会被连接的客户端的streamreader.readline卡住
TcpListener listener = new TcpListener (IPAddress.Any, 8001);
listener.Start ();
//--------------------------MAIN LOOP--------------------------
while (true)
{
//Recieve connection and take care of response
Console.WriteLine ("Awaiting connection");
TcpClient client = listener.AcceptTcpClient ();
Console.WriteLine ("Client accepted");
StreamReader sr = new StreamReader (client.GetStream ());
Console.WriteLine ("1:3");
StreamWriter sw = new StreamWriter (client.GetStream ());
Console.WriteLine ("1:4");
string fullrequests = "/no/request/value";
Console.WriteLine ("1:5");
fullrequests = sr.ReadLine (); <---- IT'S STUCK HERE
Console.WriteLine ("1:6");
它被卡住了,所以"1:6“永远不会打印到屏幕上。如果我从我的手机重新加载连接,它会经过并重新启动,但再次停留在相同的位置。如果我从中间的另一个设备偷偷插入另一个连接,它就有可能恢复正常。有没有什么想法可以解释为什么会发生这种情况,或者如何解决呢?
发布于 2016-08-03 23:03:04
在您的循环中,您可以检查client.Available
-如果有传入的数据,它将大于0,然后您可以读取。
不久前,我围绕着简化这一点构建了一个库和NuGet包;我花了更多的时间让套接字高兴,而不是在应用程序上取得进展。它可能会帮助您查看代码以供参考;虽然它不是一个出色的性能示例,但它对于处理应用程序中的一些套接字连接非常有效。
https://github.com/BrandonPotter/SimpleTCP/blob/master/SimpleTCP/Server/ServerListener.cs
List<byte> bytesReceived = new List<byte>();
while (c.Available > 0 && c.Connected)
{
byte[] nextByte = new byte[1];
c.Client.Receive(nextByte, 0, 1, SocketFlags.None);
bytesReceived.AddRange(nextByte);
if (nextByte[0] == _delimiter)
{
byte[] msg = _queuedMsg.ToArray();
_queuedMsg.Clear();
_parent.NotifyDelimiterMessageRx(this, c, msg);
} else
{
_queuedMsg.AddRange(nextByte);
}
}
https://stackoverflow.com/questions/38746934
复制相似问题