Java Socket服务器软件包
要实现生产级java socket服务器,我必须注意哪些潜在问题
目前,我已经使用核心java.net
包的ServerSocket
和Socket
类获得了一个基本的代码结构。服务器等待客户端并为其生成一个新线程
我想知道这是不是该走的路,还是在我在野外发布代码之前我必须考虑的其他问题。
以我有限的知识和经验,我想到的几件事是:
- 客户端断开连接检测和释放客户端资源李>
- 连接池,这是必要的还是我应该坚持现有的设计李>
- 服务器监控、日志记录和错误恢复等
- 使用现成的框架,比如ApacheMina李>
你的经历能说明什么
# 1 楼答案
我认为这取决于你的用例。但有一些想法:
现成的框架是一个不错的选择。正如你所发现的,这里有很多事情需要考虑。见下文。一些可能性(实现非常不同的策略)是Jini(基于发现的面向恢复的计算框架)或排队系统(提供独特的客户机/服务器解耦和事务性——基于JMS和/或AMQP)
合并是一个主要问题。这将防止你的服务器在面对太多的客户端时死机。你能用Java ExecutorService吗
你如何监控这台服务器?你能用JMX和JConsole吗?如果可以,我建议这是一个很好的第一步
如果服务器关闭会发生什么?您的客户是否能够自动重新连接?是否重试他们未完成的请求重试一个请求(即它是幂等的)是个好主意吗
在客户端和服务器之间传输什么?它们是序列化的Java类吗?如果是这样,您是否确保服务器的简单重新编译不需要客户端的重新编译(通过
serialVersionUid
s)。如果要传输字符串并转换为字节数组(常见情况),客户端和服务器是否使用相同的字符编码?如果您对编码感到困惑,那么读取this,并(可能)通过名称混乱的file.encoding
属性强制执行相同的客户机/服务器编码与分布式计算一样,考虑Peter Deutsch的{A4}。
# 2 楼答案
我倾向于简单地使用现有的库来为您完成所有这些。可能主要的两个是ApacheMina和JBoss Netty,后者(据报道)更快,而且不容易导致内存不足错误。MINA发送是异步发送到另一个线程刷新的队列上的,因此即使您很小心,也很有可能得到OoM。他们对这个IIRC有点怀疑
或者使用HornetQ,它构建在Netty之上,但也在客户端api中提供了JMS facade,因此您可以运行进程内消息服务器,您可以根据JMS进行交互。真的很方便