Странное поведение: TcpListener - PullRequest
       14

Странное поведение: TcpListener

0 голосов
/ 08 августа 2010

Итак, для некоторого фона: этот класс создан, чтобы принимать и отвечать на вызовы, сделанные удаленно в формате HTTP.

Проблема в том, что когда метод запроса POST, иногда запрособрабатывается правильно, но в большинстве случаев класс просто перестает отвечать на запросы.Кроме того, строки «Debug1» и «Debug2» никогда не записываются на консоль, даже если запрос обрабатывается правильно.Строка «Debug3» появляется только тогда, когда запрос обрабатывается правильно.

Я знаю, что это, вероятно, будет выглядеть грязно, C # - это только хобби для меня, и я учусь :) Спасибо, что потратили некоторое время, чтобы пойтичерез этот код!

Вот код:

class WebServer
{
    private TcpListener myListener;

    public WebServer(int port)
    {
        //Threading the listener
        try
        {
            myListener = new TcpListener(IPAddress.Any, port) ;
            myListener.Start();

            Thread th = new Thread(new ThreadStart(StartListen));
            th.Start() ;
        }
        catch(Exception e)
        {
            Logs.Add("WebServer|An Exception Occurred while Listening :" +e.ToString());
        }
    }
    private void StartListen()
    {
        int iStartPos = 0;
        string sHttpVersion;
        string sResponse = "";
        string sCode = " 200 OK";

        while(true)
        {
            //Accept a new connection
            Socket mySocket = myListener.AcceptSocket();
            if(mySocket.Connected)
            {
                Byte[] bReceive = new Byte[1024];
                int i = mySocket.Receive(bReceive,bReceive.Length,SocketFlags.None);
                string sBuffer = Encoding.ASCII.GetString(bReceive).TrimEnd('\0');

                iStartPos = sBuffer.IndexOf("HTTP",1);
                sHttpVersion = sBuffer.Substring(iStartPos,8); //http version (ex: "HTTP/1.1")

                if (sBuffer.StartsWith("GET / "))
                {
                    Logs.Add("WebServer|Connected:" + mySocket.RemoteEndPoint.ToString());
                    sResponse = ArrayToJson();
                }
                else if (sBuffer.StartsWith("POST"))
                {
                    Console.WriteLine("Debug1");

                    //This is a POST request, so more data is waiting to be retreived...  
                    bReceive = new Byte[2048];
                    i = mySocket.Receive(bReceive,bReceive.Length,SocketFlags.None);
                    sBuffer = Encoding.ASCII.GetString(bReceive).TrimEnd('\0');

                    Console.WriteLine("Debug2");

                    //Parsing the request
                    string[] sParams = sBuffer.Split(',');
                    Console.WriteLine(sParams.Length);
                    Console.WriteLine("Debug3: {0} - {1} - {2} - {3} - {4}", sParams[0], sParams[1], sParams[2], sParams[3], sParams[4]);

                    //I do what needs to be done here

                    Logs.Add("WebServer|BotStartRequest:" + mySocket.RemoteEndPoint.ToString());
                    sResponse = "Accepted";
                }

                //Sending response and closing socket
                SendHeader(sHttpVersion, "text/html", sResponse.Length, sCode, ref mySocket);
                SendToBrowser(sResponse, ref mySocket);
                mySocket.Close();
            }
        }
    }
}

}

1 Ответ

4 голосов
/ 08 августа 2010

Реализация HTTP / 1.1 - непростая задача. Базовый протокол выглядит довольно просто, но на самом деле трудно даже получить минимальную правильную реализацию сервера: вам нужно хотя бы подумать о постоянных соединениях, в случае POST заголовка Expect: 100-continue , правильно разбирать заголовок и многое другое.

Я настоятельно рекомендую вам взглянуть на существующие библиотеки / код. Например, класс HttpListener встроен в .NET Framework и, вероятно, уже предоставляет все, что вам когда-либо понадобится.

Если вы действительно хотите внедрить сервер с нуля, взгляните на Microsoft Cassini , простой HTTP-сервер, написанный на C # и лицензированный под Ms-PL.

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