Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java WebSocket和线程化服务器端端点_Java_Multithreading_Websocket_Endpoint - Fatal编程技术网

Java WebSocket和线程化服务器端端点

Java WebSocket和线程化服务器端端点,java,multithreading,websocket,endpoint,Java,Multithreading,Websocket,Endpoint,这里有点“noob”问题 我有一个小应用程序要写(像一个简单的游戏)。有服务器端和客户端。它必须使用WebSocket作为通信方式。服务器有一个服务器类(用main()启动服务器)和一个服务器端点类。然而,游戏不是基于回合的,而是基于实时的。因此,服务器必须在动态字段的每一个“勾选”b/c进行某些计算。 我假设线程很适合这种情况,但我不知道如何在这种服务器上放置线程 正如我所看到的,唯一可以接收/发送消息的是端点。如果我让它实现Runnable并每隔0.5秒暂停一次,它将在暂停期间不接受消息。如

这里有点“noob”问题

我有一个小应用程序要写(像一个简单的游戏)。有服务器端和客户端。它必须使用WebSocket作为通信方式。服务器有一个服务器类(用main()启动服务器)和一个服务器端点类。然而,游戏不是基于回合的,而是基于实时的。因此,服务器必须在动态字段的每一个“勾选”b/c进行某些计算。 我假设线程很适合这种情况,但我不知道如何在这种服务器上放置线程

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


提前感谢。

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

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

Out queue—将数据发送到端点 (您可以使用ConcurrentLinkedQueue。更多帮助->)

在端点内启动此处理线程。当端点接收到数据时,将它们放入In队列中。持续监听输出队列并再次将该数据发送到客户端

端点代码

@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
    }
}
公共类processingThread扩展线程{
public ConcurrentLinkedQueue inQueue=新建ConcurrentLinkedQueue();
public ConcurrentLinkedQueue outQueue=新建ConcurrentLinkedQueue();
公开募捐{
//在队列和进程中侦听
//处理后,将其放入输出队列
}
}

希望这会有所帮助:)

无法暂停对象。线程可以是。仅仅因为一个线程睡在someObject.foo()中并不意味着其他线程不能调用someObject的任何方法。所以我不明白为什么一个端点在后台线程处于睡眠状态时不接受消息。所以像这样的事情:类ServeEndpoint实现Runnable{@OnMessage public void OnMessage(会话对等,message msg)抛出EncodeException{//do smth}public void run(){if(smth){this.sleep(x);}}}不会为x暂停整个过程吗?(不幸的是,我不知道如何在注释中添加新行以提高可读性)不,那不会编译。如果您使用Thread.sleep()而不是这个.sleep()来编译它,正如javadoc所解释的,这将使当前线程休眠x毫秒。请阅读关于并发性的教程,因为您缺少基本的多线程概念。在这种情况下,我不理解WebSocket是如何工作的,以及如何使它们至少与单独的线程一起工作。