Почему мой сервер не может ответить на запрос клиента от веб-браузера? - PullRequest
0 голосов
/ 23 января 2019

Я работаю над программой Embedded Sensor Cloud (клиент-сервер) на C #, и мне не известна проблема, и мне нужна ваша помощь: D

Ниже вы можете увидеть мой код на стороне сервера, и у меня проблема в том, что всякий раз, когда я запускаю программу в режиме отладки, все работает довольно хорошо, но если я запускаю ее как обычно, мой запрос на открытие файла HTML с моего Localhost делает не работает, и браузер отправляет на сервер какой-либо пустой запрос, и он не может идти дальше.

это мой код на стороне сервера:

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());
        }
    }

Это то, что я получаю при запуске в режиме отладки:

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

сокет больше не может прослушивать входящее соединение. Кто-нибудь знает почему?

1 Ответ

0 голосов
/ 23 января 2019

Вы должны никогда использовать DataAvailable для принятия решений, отличных от "async vs sync".Он не сообщает вам, будут ли доступны данные - он только сообщает, доступны ли они прямо сейчас .Я подозреваю, что режим отладки замедляет его настолько, что данные доступны.Вместо этого вы должны выполнить чтение (синхронизация или асинхронность, по вашему выбору) с неположительным результатом чтения, означающим конец потока.клиент.Если это не для локального использования, я бы посоветовал не писать здесь свой собственный сервер - может быть проще начать с "kestrel" (основной сервер asp.net) и реализовать там свой собственный обработчик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...