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

时间:2013-11-06 13:39:20

标签: java sockets client-server threadpool

我现在正在设计一个使用套接字的火车票预订系统。客户可以搜索机票,预订机票和取消机票。客户端将向服务器发送不同的对象,如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吗?服务器如何识别不同类型的请求?

2 个答案:

答案 0 :(得分:0)

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

您可以使用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;
  ...
}

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

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

答案 1 :(得分:0)

我会将您推荐给此链接http://docs.oracle.com/javase/tutorial/networking/sockets/definition.html。阅读整个教程

我认为你缺少的小东西是你可以在套接字中写入数据,通过检索它上面的InputStream,你也可以使用其中的OutputStream读回信息。

您需要的只是一种传递所需请求类型的方法,并从服务器端的流中读取它。你不需要任何花哨的东西,可能只是传递一个字符串:“request = xxx”,并在另一边解析它。这些实现细节供您了解。