我正在用 Java 编写代理服务器。
最初,我做(简化)
server = new ServerSocket(5568);
incoming = server.accept();
input = incoming.getInputStream();
...
outgoing = new Socket(host, 80);
output = outgoing.getOutputStream();
output.write(inputbuffer, 0, i);
其中 inputbuffer 是到目前为止接收到的一些字节集合(我读取传入数据直到我知道主机头的部分,然后打开与服务器的连接并发送我到目前为止所拥有的内容)。所以服务器是我的欢迎套接字,输入是从客户端到我的代理的数据,输出是从我的代理到服务的数据。
接下来,我希望服务器的输出与客户端并行写入客户端,但客户端仍然可能向服务器写入内容。所以我创建了一个单独的线程来从客户端读取:
final InputStream finalInput = input;
final OutputStream finalOutput = output;
Thread sendingStuff = new Thread(){
public void run(){
int c;
while ((c = finalInput.read()) != -1){
finalOutput.write((byte)c);
finalOutput.flush();
}
finalInput.close();
finalOutput.close();
}
}
sendingStuff.start();
最后,我在主线程中有一个不同的部分从服务器读取并将其写入客户端。
InputStream reverseInput = outgoing.getInputStream();
OutputStream reverseOutput = incoming.getOutputStream();
int c;
while ((c = reverseInput.read()) != -1){
reverseOutput.write((byte)c);
reverseOutput.flush();
}
reverseInput.close();
reverseOutput.close();
发生的情况是我得到输入并发送输出,但是浏览器永远旋转,并且从客户端读取的线程中的行永远不会收到 -1 信号。
很多时候,我收到诸如“无效的标头名称”或“您的浏览器发送了服务器无法理解的请求”之类的错误,我认为这与我遇到的这个问题有关。有一次,我什至在从客户端读取的行上收到 IOException: Socket Closed。
那么为什么客户端不发送 EOF 呢?这是做这件事的正确方法吗?