2013-10-29 62 views
0

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

+0

这看起来像是一个多线程问题。你能扩展你的简化初始代码吗?好像你在同一个流上同时调用'read'和'write'。 InputStream/OutputStream只能使用一种方法,并调用读/写方法来提升它们。这就是为什么你得到无效的读/写,因为这两个线程同时读/写并获取不完整的数据。与没有EOF相同,如果输出流正在写入到您正在读取的同一个地方,您将得到一个无尽的IO循环。 – Radiodef

+0

从服务器读取的线程是否读取了-1? – Joni

+0

@Joni:是的。 –

回答

0

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