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

标签 java sockets network-programming

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

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>

这里是socket的核心逻辑:

        echoSocket = new Socket("www.microsoft.com", 80);
        out = new PrintWriter(echoSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(
                echoSocket.getInputStream()));

        while (true) {
            String response = in.readLine();
            if (response != null)
                System.out.println("echo: " + response);
        }

我想问题出在我的循环上?

我的应用程序的完整测试代码可以在这里看到: http://codepad.org/bmHwct35

谢谢

最佳答案

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

关于java - 我的套接字客户端似乎只收到来自 HTTP 服务器的第一个响应。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9550842/

相关文章:

sockets - 即使一侧 IP 地址发生变化,套接字是否仍保持打开状态?

java - 如何确定字符串表示中的基元类型?

java - 已将字符串编码为 DataHandler

java - 如何查找句子中二元语法的索引

c++ - 守护进程套接字在后台监听请求

python - 如何允许 ws ://instead of localhost://for tornado

ssl - 阅读 WP8 上的 SSL 证书详细信息

c - 没有从开关盒中出来

c# - 接收打印作业并将其转发到 LAN 中的打印机的软件

java - 作业: How to sort an Array List of String coming from a file