【发布时间】:2018-12-20 13:09:04
【问题描述】:
我正在使用 Java 创建代理服务器,而我的客户端和服务器都是用 NodeJS 编写的。由于客户端可以发送多个请求,所以我为每个客户端请求创建线程到代理服务器。现在,当我从服务器(整数值)得到响应时,我想从我的代理服务器将相同的数据发送回客户端。但我的代理服务器无法这样做。
客户端期望在 100 毫秒内得到响应。所以我设置了连接和读取超时属性。如果我在这段时间内没有收到响应,我想用整数 0 响应客户端。
SocketServer.java
private int portNo;
private ServerSocket serverSocket = null;
public SocketServer(int portNo) {
this.portNo = portNo;
try {
serverSocket = new ServerSocket(this.portNo);
} catch (IOException e) {
e.printStackTrace();
}
}
public void runServer() {
while(true) {
try {
Socket clientSocket = serverSocket.accept();
new Thread(new Task(clientSocket)).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]) {
SocketServer socketServer = new SocketServer(3000);
socketServer.runServer();
}
Task.java
public class Task implements Runnable {
Socket socket = null;
public Task(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String dataFromClient = in.readLine(); // this is the url from client
String partOfLink = dataFromClient.substring(5, 9);
URL url = new URL("http://localhost:3001/" + partOfLink);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setDoOutput(true);
conn.setConnectTimeout(80);
conn.setReadTimeout(80);
// Get the response
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
out.write(line);
}
} catch (IOException e) {
//e.printStackTrace();
try {
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
out.write(0);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
【问题讨论】:
-
100 毫秒对于 TCP 之上的协议来说可能不是一个合理的超时时间,因为 TCP 本身在内部使用接近超时时间(聚合数据和 ACK)。另外,你真的没有描述问题。您说代理服务器无法将数据发送回客户端,但这是什么意思?客户端与代理使用什么协议?它是否专门编码以了解零的含义?您是否希望这可以与没有特殊客户端代码的常规 HTTP 客户端一起使用,以了解如何查询代理并了解其错误处理?
-
@DavidSchwartz 也许你是对的,100ms 可能是一个问题。但是如果发生超时,那么我想将 0 作为响应发送给客户端(参见 catch 块)。因此,为了向客户端发送响应,我在这里通过套接字输出流使用 BufferedWriter。尽管如此,我的客户没有从这个代理服务器得到任何响应。简而言之,代理服务器无法响应客户端
-
如果客户端期待一个 HTTP 响应,它不会得到一个。客户是否了解如何理解该零?这样做有点尴尬,因为客户端可能会收到 HTTP 响应或可能会收到零,因此它需要一个可以处理这两种情况的成帧器、解析器和解码器。这是一件非常奇怪的事情,我敢打赌,客户没有这样做或做得不对。 (糟糕的设计,IMO。总是很难处理没有简单区分的两种可能的协议。这里,检查必须在收到原始数据之后和框架之前进行。呸。)
-
我无法控制客户端。但是客户端通过 HTTP 与代理通信。那么有没有什么方法可以不使用 HTTP 而只使用套接字连接将数据发送回客户端呢?
标签: java multithreading sockets tcp-ip http-proxy