java - Java中套接字的不同方法

标签 java sockets servlets

<分区>

我正在尝试编写一个套接字应用程序,它需要能够将作为客户端连接的人分配给作为运算符(operator)连接的人,并且运算符(operator)应该能够响应任何客户端。

我脑子里有一些方法,但我不确定它们是否有效,而且我查找的示例代码有点肤浅,所以我脑子里的问题是;

  1. 首先我想知道如果我编写一个服务器端应用程序并将客户端的输入和输出地址传输给运算符(operator),运算符(operator)是否能够直接建立连接,还是我必须通过服务器发送消息?

  2. 服务器端应用程序监听套接字/开放端口是否是一种不好的做法?

  3. 对于这样的程序(运营商端必须是多平台桌面应用程序),您还有什么建议?

最佳答案

  1. 如果您将使用地址,这可能会成为一个问题,因为客户端可能在防火墙后面连接,并且客户端地址也可能会更改。
  2. 这不是一个坏习惯,事实上,这是服务器所做的,它们监听端口。
  3. 我建议不要尝试编写基于原始套接字的实现。有几个非常好的框架可以帮助您实现高效、灵活的双向客户端-服务器消息传递,您可以利用这些框架:

    • 一种可能是使用 Websockets。 Websockets 在 Java 中有很好的服务器端实现(参见 Spring Websockets),您还可以通过 javax.websocket API 从 Java 应用程序通过 Web 套接字使用服务器并与服务器通信。

    • 如果您需要消息传递平台具有持久性等功能,您可以使用将使用 RabbitMQ 的架构。是一个消息中间件,客户端和服务器通过RabbitMQ进行通信。这可能是最容易实现的。

    • 如果您需要可以扩展到数百万端点的非常快速的通信,您应该看看 ZeroMQ .

对于所有这三个选项,都有一些非常好的消息传递范例示例,例如 RPC、发布-订阅、多播等。

希望这对您有所帮助。

关于java - Java中套接字的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34372259/

相关文章:

java - 使用 Java 7 仅访问特定深度的目录

java - 如何为 Bukkit 插件从 10 开始倒计时?

java - OneDrive REST API 为文件上传提供 400 个无效动词

java - JAVA中使用HttpServletRequest上传后文件被锁定

java - Servlet eclipse 无法识别制表符

java - 如何在JSP中为mySQL自动生成唯一ID

java - 应用程序插件与不同应用程序服务之间的通信 [Android]

sockets - 非阻塞 tun/tap 文件描述符上的 read() 出现 EAGAIN 错误

组合套接字发送的十六进制值

c - 给定任何 epoll TCP 套接字事件,如果 EPOLLRDHUP=0 且 EPOLLIN=1;后续调用 read()/recv() 是否保证返回不等于 0 的读取大小?