我正在尝试实施故障转移系统。所以我创建了一个监控服务器,假设将请求路由到不同的应用服务器。
到目前为止,我设计了一个小型监控服务器,并尝试使用HTTP/1.1 302 Found\r\n
状态代码路由请求。但我无法重定向到我的虚拟机,虽然我可以通过输入网址直接在我的浏览器上访问它。
路由代码 -
class Connection extends Thread{
Socket clientSocket;
BufferedReader din;
OutputStreamWriter outWriter;
public Connection(Socket clientSocket){
try{
this.clientSocket = clientSocket;
din = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), "ASCII"));
outWriter = new OutputStreamWriter(clientSocket.getOutputStream());
this.start();
}catch(IOException e){
System.out.println("Connection: " + e.getMessage());
}
}
public void run(){
try{
String line = null;
while((line = din.readLine())!=null){
System.out.println("Read" + line);
if(line.length()==0)
break;
}
//here write the content type etc details:
System.out.println("Someone connected: " + clientSocket);
}catch(EOFException e){
System.out.println("EOF: " + e.getMessage());
}
catch(IOException e){
System.out.println("IO at run: " + e.getMessage());
}finally{
try{
routeRequest(outWriter);
outWriter.close();
clientSocket.close();
}catch(IOException e){
System.out.println("Unable to close the socket");
}
}
}
public void routeRequest(OutputStreamWriter outWriter){
try {
outWriter.write("HTTP/1.1 302 Found\r\n");
outWriter.write("Date: Tue, 11 Jan 2011 13:09:20 GMT\r\n");
outWriter.write("Content-type: text/plain\r\n");
outWriter.write("Server: vinit\r\n");
outWriter.write("Location: http://192.168.74.128:8080/Stateless/index.html");
outWriter.write("Connection: Close");
outWriter.write("\r\n\r\n");
// String responseStr = "<html><head><title>Hello</title></head><body>Hello world from my server</body></html>\r\n";
// outWriter.write(responseStr);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
但是在浏览器而不是路由上我得到没有数据接收页面。
如果我做错了,请告诉我。
PS:如果我使用状态200,我能够显示虚拟的hello world页面
提前致谢。
答案 0 :(得分:3)
您的Location:
标头缺少行尾指示符。
outWriter.write("Location: http://192.168.74.128:8080/Stateless/index.html\r\n");
如果缺少此选项,您的Connection:
标题将成为重定向网址的一部分。客户端将保持与服务器的连接,除非您的服务器在发送此响应后明确关闭。
即使客户端超时并关闭连接,它也可能将URL视为无效。如果它确实重定向,那么将找不到页面,因为路径类似于:
/Stateless/index.htmlConnection: Close