首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# TcpListener streamreader.readline卡住了

C# TcpListener streamreader.readline卡住了
EN

Stack Overflow用户
提问于 2016-08-03 22:48:14
回答 1查看 1.1K关注 0票数 0

我已经创建了一个简单的tcp侦听服务器,我从手机连接到该服务器来控制我的天花板灯。但有时它会被连接的客户端的streamreader.readline卡住

代码语言:javascript
运行
复制
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“永远不会打印到屏幕上。如果我从我的手机重新加载连接,它会经过并重新启动,但再次停留在相同的位置。如果我从中间的另一个设备偷偷插入另一个连接,它就有可能恢复正常。有没有什么想法可以解释为什么会发生这种情况,或者如何解决呢?

EN

回答 1

Stack Overflow用户

发布于 2016-08-03 23:03:04

在您的循环中,您可以检查client.Available -如果有传入的数据,它将大于0,然后您可以读取。

不久前,我围绕着简化这一点构建了一个库和NuGet包;我花了更多的时间让套接字高兴,而不是在应用程序上取得进展。它可能会帮助您查看代码以供参考;虽然它不是一个出色的性能示例,但它对于处理应用程序中的一些套接字连接非常有效。

https://github.com/BrandonPotter/SimpleTCP/blob/master/SimpleTCP/Server/ServerListener.cs

代码语言:javascript
运行
复制
            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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38746934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档