input.read()永远不会返回-1

时间:2013-10-29 15:57:22

标签: java sockets networking

我正在用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在从客户端读取的行上关闭。

那么为什么客户端不发送EOF?这是正确的做法吗?

1 个答案:

答案 0 :(得分:0)

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