[英]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.