【问题标题】:Socket server best approach [closed]套接字服务器最佳方法[关闭]
【发布时间】:2014-11-27 15:15:14
【问题描述】:

所以我一直在用 Java 编写聊天程序/服务器。 到目前为止,我有一个非常好的客户端,以及一个看起来很有效的服务器。

基本上,服务器监听两个套接字,一个用于所有与聊天相关的内容,一个用于在需要时分发更新

当客户端连接时,它会根据服务器检查版本,如果需要,它会连接到文件套接字并下载更新的文件。

无论如何,我想弄清楚的是最好的服务器方法是什么,例如,现在当客户端连接时,它会打开一个新线程(可运行类)并在线程处理登录、发送和接收数据和 ping。

当客户端向服务器发送消息时,服务器会循环通过所有连接的客户端向它们发送消息。

在我看来,如果连接了 1000 多个客户端,则会导致很多稳定性、内存、cpu 和延迟问题,所以我很好奇处理 1000 个连接的最佳方法是什么?

【问题讨论】:

    标签: java multithreading sockets


    【解决方案1】:

    我认为检查Netty Project 可能会很有趣。它是一个开发客户端-服务器应用程序的框架。从他们的网站:

    Netty 是一个 NIO 客户端服务器框架,可以快速轻松地实现 网络应用程序的开发,例如协议服务器和 客户。它极大地简化和简化了网络编程 例如 TCP 和 UDP 套接字服务器。

    例如这个框架is used for Twitter,因为是

    • 更高的吞吐量,更低的延迟
    • 资源消耗更少
    • 最小化不必要的内存复制

    【讨论】:

    • 你的回答是合理的:)
    • 它帮助了我,我们创建了一个聊天应用程序作为我们最后一年的项目,即使我们已经提交了我们的项目并且我们获得了最高分,但我仍然要实施 Netty 我相信它会使其性能非常好高,谢谢伙计:)
    • 这似乎是最好的生产就绪库,谢谢!
    【解决方案2】:

    为每个客户端打开一个线程对于扩展环境来说是不可行的。你应该使用异步的东西来限制线程的数量。

    一个选项是一个线程用于接收/发送,一个线程用于处理连接。然而,这也不能很好地扩展。

    您应该了解 Java 如何处理 异步(即非阻塞)套接字,这里有一个看起来不错的教程。

    http://zguide.zeromq.org/java:asyncsrv

    另外,仅使用核心 Java SE7

    https://docs.oracle.com/javase/7/docs/api/java/nio/channels/AsynchronousServerSocketChannel.html

    对于其他操作,您可以设置一个线程池来有效地管理所有内容,同时保持连接用户的规模,但这又是一个很大程度上取决于您正在创建的应用程序类型的设计选择。

    【讨论】:

      猜你喜欢
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2017-08-05
      相关资源
      最近更新 更多