我正在用Java写一个代理服务器。input.read()永不返回-1
最初,我(简化的)
server = new ServerSocket(5568);
incoming = server.accept();
input = incoming.getInputStream();
...
outgoing = new Socket(host, 80);
output = outgoing.getOutputStream();
output.write(inputbuffer, 0, i);
其中INPUTBUFFER是字节的一些集接收为止(I读取传入的数据,直到在那里我知道主机头的一部分,然后打开一个连接到服务器并发送我迄今为止)。所以服务器是我的欢迎套接字,输入是从客户端发送到我的代理的数据,输出是从我的代理服务器发送的数据。
接下来,我希望将服务器的输出写入客户端,并与客户端并行写入服务器。所以,我创建一个单独的线程从客户端读取:
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?这是做这件事的正确方法吗?
这看起来像是一个多线程问题。你能扩展你的简化初始代码吗?好像你在同一个流上同时调用'read'和'write'。 InputStream/OutputStream只能使用一种方法,并调用读/写方法来提升它们。这就是为什么你得到无效的读/写,因为这两个线程同时读/写并获取不完整的数据。与没有EOF相同,如果输出流正在写入到您正在读取的同一个地方,您将得到一个无尽的IO循环。 – Radiodef
从服务器读取的线程是否读取了-1? – Joni
@Joni:是的。 –