双向网络服务器

时间:2014-07-22 10:02:18

标签: java web-services sockets netty bidirectional

我的服务器需要与客户端建立双向连接,并为少数网站提供Web服务。 实际上,webservice是一个将网站请求发送给客户的经销商。

情景是:

  1. 经销商启动它的网络服务,同时收听端口12345。
  2. Client-A将其用户名发送给经销商的端口12345,并继续收听同一端口。
  3. 经销商收到用户名,验证用户并与用户保持联系。
  4. Website-1从经销商的网络服务中调用doOperation(operation-X,User-A)。
  5. 经销商检查用户A是否存在并向其发送“operation-X”请求。
  6. 用户A调用“Operation-X”并将结果发回给经销商。
  7. 经销商将结果发回网站。
  8. 正如您在场景中看到的那样,服务器需要向客户端发送未经请求的消息,并立即获得响应以便为网站提供服务。

    首先,我实现了一个多线程双向套接字解决方案,该解决方案适用于少数客户端,但遇到性能问题,不幸的是我们有超过10万个并发用户。

    然后,我找到了netty。它看起来像一个非常有前景的解决方但它的异步和事件驱动的性质让我担心。更多,它似乎是单向的。 http://apache-avro.679487.n3.nabble.com/Writing-Unsolicited-Messages-to-a-Connected-Netty-Client-td3675163.html

    所以问题是如何进行异步握手(例如:http://biasedbit.com/handshaking-tutorial-with-netty/),然后从经销商处发送请求并获得结果?

    **非常感谢任何反馈,建议和知识共享

1 个答案:

答案 0 :(得分:3)

Netty允许您通过TCP编写任何类型的协议(实际上,UDP和其他协议,但让我们坚持使用TCP)。一旦在双方之间建立TCP连接,任何一方都可以随时发送数据,所有这些都根据某种协议进行。

术语客户端服务器并不真正适用于已建立的 TCP连接,但某些协议(如HTTP)当然会区分在连接端点的角色之间。

所以,不,Netty在Avro链接意义上不是单向的 - 这可能是Avro如何使用和暴露Netty功能的结果。

在您的情况下,“经销商”需要管理代表客户端连接和网站连接的活动渠道,并协调它们之间发送和接收的消息。这没什么特别的,你可以找到几个类似的例子和解决方案。