有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Socket服务器软件包

要实现生产级java socket服务器,我必须注意哪些潜在问题

目前,我已经使用核心java.net包的ServerSocketSocket类获得了一个基本的代码结构。服务器等待客户端并为其生成一个新线程
我想知道这是不是该走的路,还是在我在野外发布代码之前我必须考虑的其他问题。

以我有限的知识和经验,我想到的几件事是:

  1. 客户端断开连接检测和释放客户端资源
  2. 连接池,这是必要的还是我应该坚持现有的设计
  3. 服务器监控、日志记录和错误恢复等
  4. 使用现成的框架,比如ApacheMina

你的经历能说明什么


共 (2) 个答案

  1. # 1 楼答案

    我认为这取决于你的用例。但有一些想法:

    现成的框架是一个不错的选择。正如你所发现的,这里有很多事情需要考虑。见下文。一些可能性(实现非常不同的策略)是Jini(基于发现的面向恢复的计算框架)或排队系统(提供独特的客户机/服务器解耦和事务性——基于JMS和/或AMQP)

    合并是一个主要问题。这将防止你的服务器在面对太多的客户端时死机。你能用Java ExecutorService

    你如何监控这台服务器?你能用JMX和JConsole吗?如果可以,我建议这是一个很好的第一步

    如果服务器关闭会发生什么?您的客户是否能够自动重新连接?是否重试他们未完成的请求重试一个请求(即它是幂等的)是个好主意吗

    在客户端和服务器之间传输什么?它们是序列化的Java类吗?如果是这样,您是否确保服务器的简单重新编译不需要客户端的重新编译(通过serialVersionUids)。如果要传输字符串并转换为字节数组(常见情况),客户端和服务器是否使用相同的字符编码?如果您对编码感到困惑,那么读取this,并(可能)通过名称混乱的file.encoding属性强制执行相同的客户机/服务器编码

    与分布式计算一样,考虑Peter Deutsch的{A4}。

  2. # 2 楼答案

    我倾向于简单地使用现有的库来为您完成所有这些。可能主要的两个是ApacheMina和JBoss Netty,后者(据报道)更快,而且不容易导致内存不足错误。MINA发送是异步发送到另一个线程刷新的队列上的,因此即使您很小心,也很有可能得到OoM。他们对这个IIRC有点怀疑

    或者使用HornetQ,它构建在Netty之上,但也在客户端api中提供了JMS facade,因此您可以运行进程内消息服务器,您可以根据JMS进行交互。真的很方便