0

我正在用 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 呢?这是做这件事的正确方法吗?

4

1 回答 1

0

“我认为这是因为我的 HTTP 请求有 Connection: keep-alive。我该如何处理?” 我想也许你可以为一个连接打开一次套接字。尝试像 isNewConnection 这样的标志。首先将其设置为true,并在启动连接后将其设置为false。

于 2013-10-29T18:52:30.413 回答