代码之家  ›  专栏  ›  技术社区  ›  GabrielChu

在Java中对http请求使用writeUTF和readUTF

  •  0
  • GabrielChu  · 技术社区  · 8 年前

    这是一种尝试对指定网页进行爬网的Java方法。我使用writeUTF和readUTF与服务器进行套接字通信。

    static void get_html(String host, String page, int port) throws IOException {
            Socket sock = new Socket(host, port);
            String msg = MessageFormat.format("GET {0} HTTP/1.1\r\nHost: {1}\r\n\r\n", page, host);
    
            DataOutputStream outToServer = new DataOutputStream(sock.getOutputStream());
            DataInputStream inFromServer = new DataInputStream(sock.getInputStream());
    
            InputStream stream = new ByteArrayInputStream(msg.getBytes(StandardCharsets.UTF_8));
            BufferedReader buf = new BufferedReader(new InputStreamReader(stream));
            String outMsg;
    
            while ((outMsg = buf.readLine()) != null) {
                System.out.println("Sending message: " + outMsg);
                outToServer.writeUTF(outMsg);
    
                String inMsg;
                try {
                    inMsg = inFromServer.readUTF();
                } catch (EOFException eof) {
                    break;
                }
                System.out.println(inMsg);
            }
            sock.close();
        }
    

    我这样写的原因是为了模仿 c 代码,其中有一个while循环 send() 从缓冲区进行所有传递,以及另一个while循环 recv() 从缓冲区直到它到达“null”。当执行我的代码时,它只是挂在那里,我怀疑这是由于在我发送完所有消息之前调用了readUTF。如果是这种情况,有没有办法解决?

    1 回复  |  直到 8 年前
        1
  •  0
  •   user207421    8 年前

    你不能这样做。HTTP定义为文本行。 writeUTF() 不写文本,它写一种特殊格式,以16位二进制长度的字开始。类似地,HTTP服务器不会在您的 readUTF() 呼叫请参阅Javadoc。

    您必须使用二进制流和 write() 方法,使用 \r\n 作为线路终止符。根据您可能使用或可能无法使用的输出格式 readLine() 。最好不要这样做,那么您就不必编写两段代码:再次使用二进制流。

    事实上,你应该扔掉它 HttpURLConnection .实现HTTP并不像人们可能仓促想象的那么简单。