c# - 为什么我的服务器无法响应来自Web浏览器的客户端请求?

标签 c# sockets

我正在使用C#进行嵌入式传感器云(客户端-服务器)程序的工作,但据我所知存在一个问题,我需要您的帮助:D

在下面,您可以看到我的服务器端代码以及我遇到的问题是,每当我在Debug模式下运行该程序时,一切都可以正常运行,但是如果我像往常一样运行它,则从Localhost打开HTML文件的请求将无法正常工作,浏览器会向服务器发送一些空请求,因此无法继续进行。

这是我的服务器端代码:

private static void Listen()
    {
        IPAddress ipAddress = IPAddress.Any;
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 8081);

        Socket listener = new Socket(ipAddress.AddressFamily,
            SocketType.Stream, ProtocolType.Tcp);
        try
        {
            listener.Bind(localEndPoint);
            listener.Listen(10);

            while (true)
            {
                Console.WriteLine("Waiting for Connection");
                Socket handler = listener.Accept();
                Console.WriteLine("connected");
                NetworkStream stream = new NetworkStream(handler);

                if (stream.DataAvailable)
                {
                    Request req = new Request(stream);
                    Dictionary<string, string> header = new Dictionary<string, string>(req.Headers);
                    PluginManager ipm = new PluginManager();
                    IPlugin plug = SelectPlugin(ipm, req);

                    if (plug != null)
                    {
                        foreach (var item in header)
                        {
                            Console.WriteLine(item);
                        }

                        IResponse rep = plug.Handle(req);
                        rep.Send(stream);
                        Console.WriteLine("Success");

                        stream.Close();
                        handler.Shutdown(SocketShutdown.Both);
                        handler.Close();
                    }
                    else
                    {
                        IResponse resp = new Response()
                        {
                            StatusCode = 404,
                            ContentType = "text/html",
                        };
                        resp.Send(stream);
                        break;
                    }
                }
                else
                {
                    Console.WriteLine("Data not Available");
                }

            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

这是我在 Debug模式下运行时得到的:
Waiting for Connection
connected
[get .../index.html HTTP/1.1]
[user-agent, Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134]
[accept-language, en-US,en;q=0.8,de-DE;q=0.6,de;q=0.4,fa;q=0.2]
[accept, text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8]
[upgrade-insecure-requests, 1]
[accept-encoding, gzip, deflate]
[host, 8081]
[connection, Keep-Alive]
Success 

在这里,当我正常运行时:
 Waiting for Connection
 connected
 Data not Available
 Waiting for Connection

套接字无法再监听传入的连接。有人知道为什么吗?

最佳答案

您应该绝不使用DataAvailable做出除“异步还是同步”之外的决策。它不会告诉您数据是否可用-只是告诉您现在是否可用 。我怀疑 Debug模式会充分降低它的速度,以确保数据可用。相反,您应该进行读取(选择同步还是异步),读取结果为非正数,表示流结束。

就是说:看来您已经编写了可扩展到一个并发客户端的服务器。除非这是供本地使用,否则我建议不要在此处编写您自己的服务器-从“kestrel”(asp.net核心服务器)开始,并在那里实现自己的处理程序可能会更容易。

关于c# - 为什么我的服务器无法响应来自Web浏览器的客户端请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54324576/

相关文章:

C#、UTF-8 和编码字符

c# - 如何等待 2 秒之类的控制台输入?

c# - 我可以在 EF 中播种所需属性的数据吗?

windows - Windows 中的 SO_REUSEADDR 和 UDP 行为

c - 使用原始套接字从 recvfrom 获取数据

linux - 是否有必要关闭一个accept返回文件描述符

c++ - 将 char[] 转换为 Qstring 添加额外的 3 个字符

c# - 有没有更好的方法在ActionFilterAttribute中获取cookie值?

c# - Owin/IIS 应用程序在 Azure 上性能不佳

linux-kernel - SocketCAN 读取套接字调用正在阻塞