Java 在使用套接字时,我的响应似乎挂在响应类中
我目前正在实现一个web代理,但我遇到了一个问题。我可以从浏览器解析我的请求并提出一个新的请求,但我似乎在响应方面有问题。它一直挂在我的响应循环中Java 在使用套接字时,我的响应似乎挂在响应类中,java,sockets,Java,Sockets,我目前正在实现一个web代理,但我遇到了一个问题。我可以从浏览器解析我的请求并提出一个新的请求,但我似乎在响应方面有问题。它一直挂在我的响应循环中 serveroutput.write(request.getFullRequest()); // serveroutput.newLine(); serveroutput.flush(); //serveroutput.
serveroutput.write(request.getFullRequest());
// serveroutput.newLine();
serveroutput.flush();
//serveroutput.
//serveroutput.close();
} catch (IOException e) {
System.out.println("Writting tothe server was unsuccesful");
e.printStackTrace();
}
System.out.println("Write was succesful...");
System.out.println("flushed.");
try {
System.out.println("Getting a response...");
response= new HttpResponse(serversocket.getInputStream());
} catch (IOException e) {
System.out.println("tried to read response from server but failed");
e.printStackTrace();
}
System.out.println("Response was succesfull");
//response code
public HttpResponse(InputStream input) {
busy=true;
reader = new BufferedReader(new InputStreamReader(input));
try {
while (!reader.ready());//wait for initialization.
String line;
while ((line = reader.readLine()) != null) {
fullResponse += "\r\n" + line;
}
reader.close();
fullResponse = "\r\n" + fullResponse.trim() + "\r\n\r\n";
} catch (IOException`` e) {
e.printStackTrace();
}
busy = false;
}
这条线进入一个无限循环,不断冲击CPU,直到流可供读取。一般来说,这不是个好主意
这条线进入一个无限循环,不断冲击CPU,直到流可供读取。通常不是一个好主意。您正在套接字上执行阻塞同步读取。Web服务器在向您发送页面(如果指定了HTTP/1.1)后不会关闭它们的连接,因此它将一直处于关闭状态,直到Web服务器超时连接为止。要正确执行此操作,您需要查找
内容长度
标题,并在到达正文时读取适当数量的数据
您真的不应该试图重新发明轮子,而是使用Java提供的核心
HttpURLConnection
或AppacheHttpClient
来发出请求 您正在套接字上执行阻塞同步读取。Web服务器在向您发送页面(如果指定了HTTP/1.1)后不会关闭它们的连接,因此它将一直处于关闭状态,直到Web服务器超时连接为止。要正确执行此操作,您需要查找内容长度
标题,并在到达正文时读取适当数量的数据
您真的不应该试图重新发明轮子,而是使用Java提供的核心
HttpURLConnection
或AppacheHttpClient
来发出请求 您在这里犯了很多错误
- 使用自旋循环调用
,而不只是在后续读取中阻塞ready()
- 当您不知道数据是文本时,使用
读卡器
- 没有实现HTTP 1.1协议,哪怕只是一点点
shutdownOutput()
shutdownOutput()
,请退出该线程注意,除了CONNECT命令之外,您不必解析任何东西;你不必担心内容长度;您只需正确传输字节和EOS。您在这里犯了很多错误
- 使用自旋循环调用
,而不只是在后续读取中阻塞ready()
- 当您不知道数据是文本时,使用
读卡器
- 没有实现HTTP 1.1协议,哪怕只是一点点
shutdownOutput()
shutdownOutput()
,请退出该线程注意,除了CONNECT命令之外,您不必解析任何东西;你不必担心内容长度;您只需正确传输字节和EOS。服务器是否在响应结束时发送“新行”
reader.readLine()
…来自Java文档“一行被认为是由换行符('\n')、回车符('\r')或回车符紧跟着换行符中的任何一个终止的”同样-您可能不需要reader.ready()
作为reader.readLine()
将被阻止,直到它以任何方式从缓冲区中读取了一行数据……在我解析整个响应之前,我真的无法判断浏览器发送了什么。服务器在响应结束时发送了“新行”吗reader.readLine()
…来自Java文档“一行被认为是由换行符('\n')、回车符('\r')或回车符紧跟着换行符中的任何一个终止的”同样-您可能不需要reader.ready()
作为reader.readLine()
会一直阻塞,直到它从缓冲区中读取一行内容为止……在我解析整个响应之前,我真的无法判断浏览器发送了什么。我只是在设计一个代理,想了解套接字编程的细节。好了,你来了:)如果是这样的话,你必须正确处理HTTP协议,或者。。。它会挂起来的
while (!reader.ready());