【问题标题】:Websockets and Threaded server-side EndpointWebsockets 和线程服务器端端点
【发布时间】:2015-05-08 21:43:01
【问题描述】:

这里有点“菜鸟”问题。

我有一个小应用程序要编写(比如一个简单的游戏)。有服务器端和客户端。它必须使用 websockets 作为通信方式。服务器有一个服务器类(使用 main() 启动服务器)以及服务器端点类。但是,游戏不是回合制的,而是实时的。因此,服务器必须在动态字段的每个“tick”b/c 中进行某些计算。 我认为 Threads 在这种情况下会很适合,但我不知道如何将线程放在这种服务器上。

正如我所见,唯一可以接收/发送消息的是端点。如果我让它实现 Runnable 并每 0.5 秒暂停一次,它在暂停时间内不会接受消息。如果我为此目的定义一个不同的类,我不知道如何在端点内部启动它并为它们提供通信方式。 有没有人有任何建议/信息/链接/任何可能有帮助的东西?

提前谢谢你。

【问题讨论】:

  • 无法暂停对象。线程可以。仅仅因为一个线程在 someObject.foo() 中休眠并不意味着其他线程不能调用 someObject 的任何方法。所以我不明白为什么端点在后台线程休眠时不接受消息。
  • 所以类似:class ServEndPoint implements Runnable { @OnMessage public void onMessage(Session peer, Message msg) throws EncodeException { //do smth} public void run() { if(smth) {this .sleep(x);} } } 不会为 x 暂停整个事情吗? (很遗憾,我不知道如何在 cmets 中换行以提高可读性)
  • 没有。那不会编译。如果您使用 Thread.sleep() 而不是 this.sleep() 来编译它,那么正如 javadoc 解释的那样,这将使 当前线程 休眠 x 毫秒。阅读并发教程,因为您缺少基本的多线程概念。
  • 在这种情况下,我不明白 websockets 是如何工作的,以及如何使它们与至少一个独立的线程一起工作。

标签: java multithreading websocket endpoint


【解决方案1】:

服务器端点会不断地从客户端接收数据。您所要做的就是在其他线程中处理该数据。您可以为此目的定义不同的类(线程)。这个线程类将有两个不同的队列。

在队列中 - 从端点接收数据

Out queue - 向端点发送数据 (您可以为此使用 ConcurrentLinkedQueue。更多帮助 -> How to use ConcurrentLinkedQueue?

在端点内启动这个处理线程。当端点接收到数据时,将它们放入 In Queue。持续监听 Out Queue 并将该数据再次发送到客户端。

端点代码

@OnMessage
public void onMessage(String message,Session peer) throws IOException{
     processingThread t = new processThread(peer);
     t.inQueue.add(data);
     t.start();
     String s;
     //listen to the Out Queue
     while (true) {
         while ((s =t.outQueue.poll()) != null) {
                    peer.getBasicRemote.sendText(dataToBeSent);                          
         }
     }
 }

处理线程代码

public class processingThread extends Thread{
    public ConcurrentLinkedQueue<String> inQueue = new ConcurrentLinkedQueue<String>();
    public ConcurrentLinkedQueue<String> outQueue = new ConcurrentLinkedQueue<String>();

    public void run(){
        //listen to in queue and process
        //after processing put to the out queue
    }
}

希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 2012-05-25
    • 2017-05-19
    • 2021-10-29
    • 2014-12-06
    • 2021-12-15
    • 1970-01-01
    • 2013-01-28
    • 2016-09-26
    • 1970-01-01
    相关资源
    最近更新 更多