【问题标题】:Java multithreaded serverJava 多线程服务器
【发布时间】:2015-02-10 01:18:37
【问题描述】:

我正在用 Java 编写游戏服务器。在游戏服务器中很常见,我必须获取一个客户端接收到的数据并将其分发到客户端的房间(其他客户端)。目前,每个客户端都产生自己的线程并在此之上工作。但是,我在定义玩家之间的关系时遇到了麻烦。我如何控制诸如聊天之类的东西,其中必须将消息回显给同一房间中的所有其他玩家?我正在考虑类似于消息队列的东西,所有线程通常都会查找消息并将它们发送到自己的客户端。

我也愿意接受立即放弃多线程的建议,但我对 NIO 并不熟悉,而且服务器已经使用普通的 Sockets 和 Threads 编写。

总结:我如何让我的客户(在线程中)相互交谈?还是有更好的非线程替代方案?

【问题讨论】:

  • 使用像 Netty 这样的框架会让你的生活更轻松,你的应用程序更具可扩展性。我确信向连接的客户端广播数据成为一项简单的任务。可能会有一点学习曲线,但这是值得的。
  • @JurgenCamilleri 当我阅读 netty 的入门手册时,我倒吸一口凉气!这么多builders 和factorys 让我哭了!您是否知道更好的学习资源,或者那是真实且经过测试的方式?
  • 根据我使用 Netty 的经验,我刚开始编写示例并自己尝试;然后开始在它们之上构建我需要的东西,并丢弃我不需要的东西。这个 YouTube 频道包含一个看起来很有前途的系列:youtube.com/channel/UCIA0yteJXa5JgRqxFJYQbEQ

标签: java multithreading sockets io server


【解决方案1】:

我使用的一种方法是设计一个 Server 类和一个扩展 Thread 的类。

Server 类将生成所有线程,并保留它创建的所有当前正在运行的线程的列表。

在您的 Thread 类中,使用 Socket 对象来创建您的输入/输出流。当其中一个线程有话要说时,它将通过流与服务器对话,然后由服务器将该消息传递给其当前正在运行的所有线程。

这个非常简单的java教程实际上帮了我很多。

https://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html

【讨论】:

  • 哦,所以服务器在一个单独的线程上,在各自的线程上监听客户端?这不会在客户端写入和服务器接收之间引入延迟吗?
  • 当然,总会有某种延迟。但是您预计会有多少延迟?
  • 嗯实际上它现在听起来很高效。主线程的唯一工作是监视客户端线程请求广播和东西。听起来不错,如果 netty 对我不起作用,我可能会尝试一下。谢谢!
  • 没问题!回到家后,我可以向您展示我编写的代码,这可能比简单的英语更有帮助。
  • 我正在阅读一些材料并在这个问题programmers.stackexchange.com/questions/185385/… 中找到了答案,它指出使用套接字在线程之间进行通信是不可以的。我在这里错过了什么吗?
【解决方案2】:

我提出的解决方案也类似于 Jakeway。我以这种方式完全实现了相同的功能。

服务器将创建一个线程并在该线程中创建服务器套接字并等待连接

客户端将连接到服务器。服务器将创建 ClinetSocket 并将此套接字传递给线程。该线程负责来自服务器的客户端/服务器通信

在客户端,在创建 Socket 时,将启动一个线程,该线程负责来自客户端的客户端/服务器通信

从下面的链接中查看一些现成的代码。

chat example 1

chat example 2

关于套接字使用的优缺点,请访问以下链接:rmi vs servlets vs sockets

关于客户端之间的通信?不可行。客户端将向服务器发送消息,服务器应向其他客户端发送消息。如果你看一下雅虎的聊天方式

1) 您将在聊天室中向服务器发送消息

2) 服务器有订阅聊天室的客户列表

3) 服务器将向所有订阅房间的客户端发送消息

【讨论】:

    【解决方案3】:

    嘿,我为此创建了一个库! https://www.dropbox.com/s/xcy1uyyyc610lb5/JSock.rar?dl=0 只需下载它并将其导入您的项目。 阅读 ReadMe.txt,它将解释大部分内容。 如果您需要我解释更多,请询问!

    【讨论】:

    • 将链接的相关部分包含在您的答案中,以演示代码示例。目前这个答案非常垃圾,尤其是链接到一个 DropBox .rar... 为什么不使用 GitHub 来分享?似乎更合法。
    猜你喜欢
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多