从主线程中的 tcp 侦听器回调中获取数据

本文关键字:回调 获取 数据 侦听器 线程 tcp | 更新日期: 2023-09-27 18:35:31

我已经创建了一个透明的代理来修复传入的数据,但我想在主线程(我打开套接字的地方)中拥有来自侦听回调的所有数据。在 C# 中执行此操作的最佳方法是什么?

我正在使用库 TrotiNet 加上一些重写逻辑 - 修复响应标头。简单的代码 - 如下

using System;
using TrotiNet;
namespace TrotiNet.Example
{
    public class TransparentProxy : ProxyLogic
    {
        public TransparentProxy(HttpSocket clientSocket)
        : base(clientSocket) { }
        static new public TransparentProxy CreateProxy(HttpSocket clientSocket)
        {
            return new TransparentProxy(clientSocket);
        }
        protected override void OnReceiveRequest()
        {
            Console.WriteLine("-> " + RequestLine + " from HTTP referer " +
                RequestHeaders.Referer);
        }
        protected override void OnReceiveResponse()
        {
            Console.WriteLine("<- " + ResponseStatusLine +
            " with HTTP Content-Length: " +
            (ResponseHeaders.ContentLength ?? 0));
        }
    }
    public static class Example
    {
        public static void Main()
        {
            int port = 12345;
            bool bUseIPv6 = false;
            var Server = new TcpServer(port, bUseIPv6);
            Server.Start(TransparentProxy.CreateProxy);
            Server.InitListenFinished.WaitOne();
            if (Server.InitListenException != null)
                throw Server.InitListenException;
            while (true)
            {
                //need to get the response data here
                System.Threading.Thread.Sleep(1000);
            }
            //Server.Stop();
        }
    }
}

所以主要是,我需要在主线程(示例.主执行器)中获取 OnReceiveResponse 的所有数据。我为一个调用做这样的代理 - 所以数据不超过 1kB。

从主线程中的 tcp 侦听器回调中获取数据

可能你适合生产者/消费者模式,尝试使用 BlockingCollection 它支持"并发添加和获取来自多个线程的项目"

(https://msdn.microsoft.com/en-us/library/dd997371(v=vs.110).aspx)像这样:

BlockingCollection<Data> dataItems = new BlockingCollection<Data>(100);

在你的数据接收器处理程序做

dataItems.Add(data);

在您的主线程使用者中:

data = dataItems.Take();

也最好将无限循环替换为睡眠到控制台.Readkey()