Парсер TcpListener - PullRequest
       14

Парсер TcpListener

0 голосов
/ 29 марта 2019

У меня есть простой TcpListener, и я хочу проанализировать данные, которые он получает.Вот что у меня есть, и оно работает:

TcpListener listener = new TcpListener(localAddr, port);
var client = listener.AcceptTcpClient();
var buffer = new byte[10240];
var stream = client.GetStream();
var length = stream.Read(buffer, 0, buffer.Length);
var incomingMessage = Encoding.UTF8.GetString(buffer, 0, length);

результаты

Incoming message: POST /api/v1/myapi/ HTTP/1.1
Content-Type: application/json
ApiKey: dac38055e7914b1f8ca5de1683b58322
cache-control: no-cache
Postman-Token: 50da88e4-5c89-4368-a5eb-1574eb35b24a
User-Agent: PostmanRuntime/7.6.1
Accept: */*
Host: MyDNS:13000
accept-encoding: gzip, deflate
content-length: 590
Connection: keep-alive

AmazingDataFromBody

Есть ли что-то, что может разобрать это, или я должен написать свой собственный?

1 Ответ

1 голос
/ 03 апреля 2019

Как я вижу, вы хотите обработать HTTP-запрос, поэтому:

  1. Вместо TCPListener используйте HttpListener для обработки HTTP-запроса и ответа.Ссылка: https://docs.microsoft.com/en-us/dotnet/api/system.net.httplistener?view=netframework-4.7.2
  2. Добавьте префикс к HTTPLister с вашим URI http:localhost[:port]/api/v1/myapi/, используя хост и порт.
  3. Start HttpListener.
  4. Используйте GetContext(), чтобы получить объект HttpListenerRequest.
  5. С помощью HttpListenerRequest вы можете получить Заголовки и тело, проверьте эту ссылку: https://docs.microsoft.com/en-us/dotnet/api/system.net.httplistenerrequest?view=netframework-4.7.2
  6. Используйте GetContext(), чтобы получитьHttpListenerResponse объект.

Используя образец https://docs.microsoft.com/en-us/dotnet/api/system.net.httplistener?view=netframework-4.7.2, вы можете увидеть:

    // This example requires the System and System.Net namespaces.
    public static void SimpleListenerExample(string[] prefixes)
    {
        // 1
        HttpListener listener = new HttpListener();
        // 2
        listener.Prefixes.Add("http:/localhost:8080//api/v1/myapi/");

        // 3
        listener.Start();
        Console.WriteLine("Listening...");

        //4
        HttpListenerContext context = listener.GetContext();
        HttpListenerRequest request = context.Request;

        //5
        HttpListenerResponse response = context.Response;

        //Building a response
        string responseString = "<HTML><BODY>My response</BODY></HTML>";
        //Take care of encoding
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);

        //6
        response.ContentLength64 = buffer.Length;
        //Get the stream to wite the response body
        System.IO.Stream output = response.OutputStream;
        output.Write(buffer,0,buffer.Length);
        // You must close the output stream.
        output.Close();
        listener.Stop();
    }

, если вы не хотите использовать HttpListener васМожно использовать эти основные шаги, используя TCPListener и TCPClient, но вы должны знать о протоколе HTTP:

  1. Строковое чтение заголовка.
  2. Действителен, если естьТело, используя заголовок content-length.
  3. Считайте тело в соответствии с размером content-length.

В моем случае я предпочитаю использовать HttpListener,что позволяет обрабатывать несколько аспектов HTTP, например, сертифицированных.

...