【问题标题】:Kryo - How to keep the server running and waiting for requestsKryo - 如何保持服务器运行并等待请求
【发布时间】:2013-09-16 09:29:54
【问题描述】:

我使用Kryo-net 发送和接收消息。在服务器端我打开新线程并设置服务器,问题是线程在代码末尾结束,所以没有真正的请求监听器。

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener;
import com.esotericsoftware.kryonet.Server;

public class MessagingServer implements Runnable{
  private Server server;

  public void stop(){
    this.server.stop();
  }  

  public MessagingServer(){ 
    this.server = new Server();
  }

  @Override
  public void run() {
    try{
      if(server!=null){ stop(); }      

      this.server.start();
      this.server.bind(54555, 54777);

      Kryo kryo = this.server.getKryo();
      kryo.register(NewRequiredJobRequest.class);
      kryo.register(NewRequiredJobResponse.class);

      server.addListener(new Listener() {
         @Override
         public void received (Connection connection, Object object) {
            if (object instanceof HelloRequest) {
               HelloRequest request = (HelloRequest)object;
               System.out.println(request.text);

               HelloResponse response = new HelloResponse();
               response.text = "Thanks!";
               connection.sendTCP(response);
            }
         }
      });
    } catch (Exception e) {
      System.out.println("kryo server exception"));
    } 

    // once the code reach here the thread is ended..
  }
}

【问题讨论】:

    标签: java kryo


    【解决方案1】:

    服务器对象可能有某种必须循环运行的listenaccept 方法。

    【讨论】:

      【解决方案2】:

      KryoNet Client#start 和 Server#start 启动一个守护线程。如果您的应用中没有其他非守护线程:

      new Thread(client).start();
      new Thread(server).start();
      

      【讨论】:

        【解决方案3】:

        我从未使用过 kryo,但我认为这会有所帮助。

            import com.esotericsoftware.kryo.Kryo;
            import com.esotericsoftware.kryonet.Connection;
            import com.esotericsoftware.kryonet.Listener;
            import com.esotericsoftware.kryonet.Server;
        
            public class MessagingServer implements Runnable{
              private Server server;
        
              public void stop(){
                this.server.stop();
              }  
        
              public MessagingServer(){ 
                this.server = new Server();
              }
        
              @Override
              public void run() {
                try{
                  if(server!=null){ stop(); }      
        
                  this.server.start();
                  this.server.bind(54555, 54777);
        
                  while(true) {
        
                   Kryo kryo = this.server.getKryo();
                   kryo.register(NewRequiredJobRequest.class);
                   kryo.register(NewRequiredJobResponse.class);
        
                   server.addListener(new Listener() {
                     @Override
                     public void received (Connection connection, Object object) {
                        if (object instanceof HelloRequest) {
                           HelloRequest request = (HelloRequest)object;
                           System.out.println(request.text);
        
                           HelloResponse response = new HelloResponse();
                           response.text = "Thanks!";
                           connection.sendTCP(response);
                        }
                     }
                   });
                 }
                } catch (Exception e) {
                  System.out.println("kryo server exception"));
                } 
        
              }
            }
        

        【讨论】:

        • 这只是添加监听器。
        猜你喜欢
        • 1970-01-01
        • 2013-01-26
        • 2018-11-02
        • 1970-01-01
        • 2017-06-09
        • 1970-01-01
        • 1970-01-01
        • 2020-09-15
        • 1970-01-01
        相关资源
        最近更新 更多