Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的套接字客户端似乎只接收来自HTTP服务器的第一个响应。为什么?_Java_Sockets_Network Programming - Fatal编程技术网

Java 我的套接字客户端似乎只接收来自HTTP服务器的第一个响应。为什么?

Java 我的套接字客户端似乎只接收来自HTTP服务器的第一个响应。为什么?,java,sockets,network-programming,Java,Sockets,Network Programming,我正在尝试开发一个类,它允许我在线程上运行套接字,并允许我在任何时候通过它发送数据,以及在数据到达时接收通知。它不应该假设任何事情,比如只在它首先发送消息之后才接收消息,等等。 出于某种原因,以下代码仅打印第一个请求的响应: public static void main(String[] args) throws IOException { TCPClient client = new TCPClient(new TCPClientObserver()); client.con

我正在尝试开发一个类,它允许我在线程上运行套接字,并允许我在任何时候通过它发送数据,以及在数据到达时接收通知。它不应该假设任何事情,比如只在它首先发送消息之后才接收消息,等等。 出于某种原因,以下代码仅打印第一个请求的响应:

public static void main(String[] args) throws IOException {
    TCPClient client = new TCPClient(new TCPClientObserver());
    client.connect("www.microsoft.com", 80);

    sleep(1000);
    client.send("HTTP GET");

    sleep(5000);
    client.send("XYZ");
}
印刷品

echo: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
echo: <HTML><HEAD><TITLE>Bad Request</TITLE>
echo: <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
echo: <BODY><h2>Bad Request - Invalid URL</h2>
echo: <hr><p>HTTP Error 400. The request URL is invalid.</p>
echo: </BODY></HTML>
我想问题在于我的循环

我的应用程序的完整测试代码可在此处查看:


谢谢

问题在于HTTP服务器使用HTTP协议,而您的客户端代码没有正确使用该协议。相反,它只是打开一个普通的套接字,编写一些似乎基于猜测的随机内容

HTTP协议在中指定。如果你读了它,你会发现你所做的和客户应该做的完全不同

我建议您不要试图以这种方式实现您的客户机。从头开始实现HTTP协议的客户端太多了。。。世界不需要另一个扁平的HTTP客户端。使用标准URL/HttpURLConnection API,或使用第三方HTTP客户端库



在您的情况下,400响应很可能是发送错误请求的结果。HTTP GET请求(实际上是任何HTTP请求)应该在第一行中包含目标URL。阅读规范。

问题在于HTTP服务器使用HTTP协议,而您的客户端代码没有正确使用该协议。相反,它只是打开一个普通的套接字,编写一些似乎基于猜测的随机内容

HTTP协议在中指定。如果你读了它,你会发现你所做的和客户应该做的完全不同

我建议您不要试图以这种方式实现您的客户机。从头开始实现HTTP协议的客户端太多了。。。世界不需要另一个扁平的HTTP客户端。使用标准URL/HttpURLConnection API,或使用第三方HTTP客户端库



在您的情况下,400响应很可能是发送错误请求的结果。HTTP GET请求(实际上是任何HTTP请求)应该在第一行中包含目标URL。阅读规范。

问题不在于循环,而在于您发送的第一个请求。“HTTP GET”是无效请求,服务器应响应“400错误请求”,然后关闭连接。这就是为什么你的第二条信息没有得到回应。请尝试一个有效的HTTP请求,例如“GET/HTTP/1.1\r\n主机:www.microsoft.com\r\n\r\n”。HTTP 1.1连接在默认情况下保持活动状态,因此您可以发送多个连接并接收后续响应。

问题不在于循环,而在于您发送的第一个请求。“HTTP GET”是无效请求,服务器应响应“400错误请求”,然后关闭连接。这就是为什么你的第二条信息没有得到回应。请尝试一个有效的HTTP请求,例如“GET/HTTP/1.1\r\n主机:www.microsoft.com\r\n\r\n”。HTTP 1.1连接在默认情况下保持活动状态,因此您可以发送多个连接并接收后续响应。

您发送的第一个连接是无效的请求,响应后服务器将关闭连接。在您的代码中,当连接/流关闭(到达流结束)时,您将继续从
readLine
返回
null
,从而卡在
while(true)
循环中


while(true){/您发送的第一个请求无效,在回复后,服务器将关闭连接。在您的代码中,您将被困在
while(true)
循环中,因为在连接/流关闭(到达流结束)时,您将不断从
readLine
返回
null


while(true){/假设HTTP 400是您所期望的,那么如果readLine()返回null,您需要中断循环。这通常是这样写的:

while ((line = in.readLine()) != null)
{
    // ...
}

假设HTTP 400是您所期望的,那么如果readLine()返回null,您需要中断循环。这通常是这样写的:

while ((line = in.readLine()) != null)
{
    // ...
}
while ((line = in.readLine()) != null)
{
    // ...
}