繁体   English   中英

Java服务器处理来自客户端的不同请求

[英]Java server handle different requests from client

我现在正在设计使用套接字的火车票预订系统。 客户可以搜索票,预订票和取消票。 客户端将向服务器发送不同的对象,例如SearchRequest,BookRequest和CancelRequest。 在服务器端,我希望有三个线程池来处理每个请求。 这是我处理搜索请求的方式。

searchserverSocket = new ServerSocket(search_portNum);
search_pool = Executors.newFixedThreadPool
              (Runtime.getRuntime().availableProcessors()*POOL_SIZE); 
public void service(){
        while(true){
            Socket search_socket = null;
            try{
                search_socket = searchserverSocket.accept();
                SearchHandler search_han = new SearchHandler(search_socket,search_request);

                search_pool.submit(search_han);

            }catch(IOException e){
                e.printStackTrace();
            }
        }   
    }

我现在很困惑如何处理其他两个请求。 我应该在其他端口上创建一个新的ServerSocket吗? 服务器如何识别不同类型的请求?

从套接字中将获得一个字节流,您需要使用该流来确定正在请求的操作-您需要设计一个协议。

您可以只使用Java类来定义协议,序列化实例并将字节写入套接字,尽管如果执行此任务,我将使用Google Protocol Buffer 例如,您可以像这样为每种请求类型定义消息(我猜您需要的字段):

message Search 
{
  required string destination = 1;
  required string origin = 2;
  ...
}

message Book
{
  required int32 trainId = 1;
  required string destination = 2;
  required string origin = 3;   
  ...
}

message Cancel
{
  required int32 bookingId = 1;
  ...
}

当拥有定义协议的类时,您需要考虑它们将如何以字节数组的形式出现,这是您从套接字中获得的。 这里重要的是考虑框架,因为您的服务器有望收到请求流。 有两种常见的方法-使用定界符标记每个消息的结尾,或者在每个消息之前以固定的字节数写入消息的长度。 两者都有其优点和缺点。

从套接字读取消息后,就可以打开请求类型并调用适当的处理程序类。

我将向您介绍此链接http://docs.oracle.com/javase/tutorial/networking/sockets/definition.html 阅读整个教程

我认为您所缺少的一点是,您可以通过检索其上的InputStream来在Socket中写入数据,也可以使用其中的OutputStream来回读信息。

您所需要的只是一种传递所需类型的请求,并从服务器端的流中读取请求的方法。 您不需要任何花哨的内容,只需传递一个字符串:“ request = xxx”,然后在另一侧进行解析。 这些实现细节供您确定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM