Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Thrift-每个套接字的不同处理程序实例_C++_Sockets_Cassandra_Thrift - Fatal编程技术网

C++ Thrift-每个套接字的不同处理程序实例

C++ Thrift-每个套接字的不同处理程序实例,c++,sockets,cassandra,thrift,C++,Sockets,Cassandra,Thrift,我正在用Thrift开发一个“代理”服务器。我的问题是,每一个进入代理的连接都使用相同的处理程序实例。代理的客户端实现在处理程序中,因此所有客户端都通过同一个连接与终端服务器通信 我有:n个客户端->n个套接字->1个处理程序->1个套接字->1个服务器 我想要实现的是:n个客户端->n个套接字->n个处理程序->n个套接字->1个服务器 现在的问题是,如果客户机更改服务器上的“本地”参数(为每个客户机独立定义的参数),其他客户机也将使用更改的环境 shared_ptr<CassProxy

我正在用Thrift开发一个“代理”服务器。我的问题是,每一个进入代理的连接都使用相同的处理程序实例。代理的客户端实现在处理程序中,因此所有客户端都通过同一个连接与终端服务器通信

我有:n个客户端->n个套接字->1个处理程序->1个套接字->1个服务器 我想要实现的是:n个客户端->n个套接字->n个处理程序->n个套接字->1个服务器

现在的问题是,如果客户机更改服务器上的“本地”参数(为每个客户机独立定义的参数),其他客户机也将使用更改的环境

shared_ptr<CassProxyHandler> handler(new CassProxyHandler(adr_s,port_s,keyspace));
shared_ptr<TProcessor> processor(new CassandraProcessor(handler));
shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
shared_ptr<TTransportFactory> transportFactory(new TFramedTransportFactory());
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
TThreadedServer server(processor, serverTransport, transportFactory, protocolFactory);
server.serve();
shared_ptr处理程序(新的CassProxyHandler(adr_s,port_s,keyspace));
共享ptr处理器(新的CassandrapProcessor(handler));
共享的ptr服务器传输(新的TServerSocket(端口));
共享的ptr transportFactory(新的TFramedTransportFactory());
共享的ptr协议工厂(新的TBinaryProtocolFactory());
TThreadedServer服务器(处理器、服务器传输、传输工厂、协议工厂);
server.service();
有没有办法实现一个服务器,为每个服务器套接字创建一个新的处理程序实例,而不是使用同一个处理程序

谢谢你的建议和帮助,
@

您可以将代理服务器设置为一个通用的TCP代理,为每个传入连接打开一个新的TCP连接,而不是让代理服务器节省开支。

我已经设法解决了这个问题。有一个已经用Java实现的解决方案。我用了同样的思想,在C++中实现了。 我做的第一件事是创建了一个TProcessorFactory而不是TTTransport类。这将处理每个连接的TProcessor。它有一个映射结构,所以它的get函数为每个tttransport返回相应的TProcessor。每个客户端对应的(唯一的)TProcessor

我必须创建一个新的TServer,因此它将接受新创建的参数TProcessorFactory而不是TProcessor。在TServer中,还需要更改几个函数调用。getProcessor函数将不再返回TProcessor,而是返回TProcessorFactory(因此更改返回类型并重命名)

您必须做的最后一件事是实现一个允许实例化的服务器,一个TServer的派生类。我建议使用TNonblockingServer(实现更改有点困难)或TThreadPoolServer。您必须更改几个函数调用。在TProcessorFactory上使用带有tttransport参数的get函数,在需要时获取TProcessor。TTTransport参数对于每个线程都是唯一的,每个客户端连接由一个线程处理

还要确保删除旧的tprocessor,因为thrift重用(至少在TNonblockingServer中)ttTransport,因此如果您不删除它们并且客户端连接,他可能会得到一个非活动的上一个会话,而您可能不想要它。如果您使用共享指针,只要在客户端断开连接时将它们从映射结构中删除,如果thrift不再需要这些指针,它们就会被销毁

我希望这对任何遇到和我一样问题的人都有帮助。如果你不知道节俭的内在结构,这里有一个很好的指南:

我希望节俭的开发者在不久的将来会实现类似的、但更复杂、更抽象的解决方案


@

我知道这是一个古老的线程,但如果它对任何人都有用的话,我已经对节俭的C#实现进行了更改,以解决这个问题

除了将TProcessor作为第一个参数传递给线程服务器的旧方法之外,现在还可以设置如下内容

new ThreadPoolServer(processorFactory,serverTransport,
                                    transportFactory,protocolFactory);
其中“processorFactory”是一个TProcessorFactory

我创建了TPrototypeProcessorFactory(对象[]handlerArgs),其设置如下:

TProcessorFactory processorFactory = 
      new TPrototypeProcessorFactory<ThriftGenerated.Processor, MyHandlerClass>(); 
t处理器工厂处理器工厂=
新的TPrototypeProcessorFactory();
“MyHandlerClass”实现ThriftGenerated.Iface。或者,如果此类接受参数,则可以将它们作为对象数组添加到处理器工厂。 内部-对于每个新的客户端连接,此处理器工厂将:

  • 使用任何参数创建“MyHandlerClass”的新实例 提供(使用Activator.CreateInstance)

  • 如果“MyHandlerClass”实现了“TControllingHandler”,它将设置 父TServer的“server”属性(例如,允许控制 使用thift客户端的TServer)

  • 返回ThriftGenerated.Processor(处理程序)的新实例

  • 因此,对于C#您可以得到n个客户端->n个套接字->n个处理程序->n个套接字->1个服务器


    我希望这对其他人有用-这确实解决了我的一个问题。

    我考虑过这一点,但是我需要打开包,以便根据包中包含的信息将包转发到正确的服务器。如果没有thrift,实现它将是一项巨大的工作。您是否曾经在apache thrift上提交过ticket/issue/feature请求?我认为这也可以用于非常容易地实现全双工/双向通信。