我已经制作了一个简单的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”永远不会打印到屏幕上。如果我从手机重新加载连接,它会经过并重新启动但再次粘在同一个地方。如果我潜入另一台设备之间的另一个连接,它有可能恢复正常。关于为什么会这样或如何绕过它的任何想法?
答案 0 :(得分:-1)
在循环中,您可以检查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);
}
}