0

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

4

2 回答 2

0

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

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

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

于 2013-11-06T14:12:47.663 回答
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;
  ...
}

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

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

于 2013-11-06T14:11:13.390 回答