我正在用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?这是正确的做法吗?
答案 0 :(得分:0)
“我认为这是因为我的HTTP请求有Connection:keep-alive。我该如何处理?” 我想也许你可以只为一个连接打开你的套接字一次。 尝试拥有像isNewConnection这样的标志。首先将其设置为true,并在启动连接后将其设置为false。