C# TcpListener解析器

C# TcpListener解析器,c#,tcplistener,C#,Tcplistener,我有一个简单的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

我有一个简单的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

是否有任何东西可以解析此内容,或者我必须编写自己的内容?

如我所见,您希望处理HTTP请求,因此:

  • 不要使用
    TCPListener
    来处理HTTP请求和响应。链接:
  • 使用主机和端口,使用URI将前缀添加到http:localhost[:port]/api/v1/myapi/
  • Start
    HttpListener
  • 使用
    GetContext()
    获取
    HttpListenerRequest
    对象
  • 使用
    HttpListenerRequest
    可以获取标题和正文,请检查以下链接:
  • 使用
    GetContext()
    获取
    HttpListenerResponse
    对象
  • 使用示例,您可以看到:

    //此示例需要System和System.Net命名空间。
    公共静态void SimpleListenerExample(字符串[]前缀)
    {
    // 1
    HttpListener=新的HttpListener();
    // 2
    Add(“http:/localhost:8080//api/v1/myapi/”;
    // 3
    listener.Start();
    Console.WriteLine(“监听…”);
    //4
    HttpListenerContext=listener.GetContext();
    HttpListenerRequest=context.request;
    //5
    HttpListenerResponse=context.response;
    //建立回应
    string responseString=“我的响应”;
    //注意编码
    byte[]buffer=System.Text.Encoding.UTF8.GetBytes(responseString);
    //6
    response.ContentLength64=buffer.Length;
    //让流与响应体一起运行
    System.IO.Stream输出=response.OutputStream;
    输出.写入(缓冲区,0,缓冲区.长度);
    //必须关闭输出流。
    output.Close();
    listener.Stop();
    }
    
    如果您不想使用
    HttpListener
    可以使用以下基本步骤,使用
    TCPListener
    TCPClient
    ,但您必须了解HTTP协议:

  • 逐行阅读标题
  • 如果有正文,则使用
    内容长度
    标题有效
  • 根据
    内容长度的大小信息阅读正文

  • 在我的例子中,我更喜欢使用
    HttpListener
    ,它允许处理HTTP的多个方面,比如认证。

    .Net提供了
    HttpClient
    ,为什么不使用它呢?还是Web API?看起来你想重新发明轮子。