我现在正在设计一个使用套接字的火车票预订系统。客户可以搜索机票,预订机票和取消机票。客户端将向服务器发送不同的对象,如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吗?服务器如何识别不同类型的请求?
答案 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”,并在另一边解析它。这些实现细节供您了解。