【问题标题】:Bi-directional Netty Server双向 Netty 服务器
【发布时间】:2014-07-22 10:02:18
【问题描述】:

我有一台服务器,它需要与客户端进行双向连接,并为少数网站提供 Web 服务。 实际上,webservice 是一个将网站请求植根于客户端的经销商。

场景是:

  1. Dealer 启动它的 Web 服务,同时监听 12345 端口。
  2. Client-A 将其用户名发送到经销商的 12345 端口并继续侦听同一端口。
  3. 经销商接收用户名,验证用户并保持与用户的连接。
  4. Website-1 从经销商的 Web 服务调用 doOperation(operation-X,User-A)。
  5. 经销商检查用户-A 是否存在并向其发送“操作-X”请求。
  6. User-A 调用“Operation-X”并将结果发送回经销商。
  7. 经销商将结果发送回网站。

正如您在场景中看到的,服务器需要向客户端发送未经请求的消息并立即获得响应以服务网站。

首先,我实现了一个多线程双向套接字解决方案,它对少数客户端运行良好,但出现了性能问题,不幸的是我们有超过 10k 的并发用户。

然后,我找到了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/),然后从经销商处发送请求并获得结果?

** 非常感谢任何反馈、建议和知识分享

【问题讨论】:

    标签: java web-services sockets netty bidirectional


    【解决方案1】:

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

    clientserver 这两个术语并不真正适用于 已建立 TCP 连接,但某些协议,如 HTTP,当然可以区分连接端点的角色之间。

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

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

    【讨论】:

    • 亲爱的四十二,谢谢。你给了我走得更远的信心。然而,这是我第一个使用 netty 和套接字的项目,我找不到任何示例。我所需要的只是找到一个工作示例来做 POC,然后自己编写。你有或知道吗?
    • @NilNull 看看secure chat server example。我相信它具有您描述的一些特征。
    • 是的,我看过了,我的方法和netty的例子的不同之处在于,在我的情况下,服务器需要发起通信;它需要根据用户名找到频道的频道并向其发送消息。在聊天服务器中,服务器正在响应客户端的请求
    • 聊天服务器正在“启动”除发送消息的客户端之外的所有客户端的通信,所以我真的看不出有什么区别。
    • 是的,这就是重点,它在收到后启动。我需要一个公共功能来随时向“特定用户”发送消息
    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 2013-01-27
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2019-09-25
    相关资源
    最近更新 更多