C#TcpListener streamreader.readline卡住

时间:2016-08-03 14:48:14

标签: c# sockets tcplistener

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

1 个答案:

答案 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);
                }
            }

NuGet Package