带有 Java 套接字的 HTTP 客户端

我尝试在 Java 中打开 TCP 套接字并向服务器 (www.abc.net.au) 发送 GET 请求并将响应打印到控制台。


客户端代码:


import java.util.Scanner;


import java.net.InetAddress;

import java.net.SocketAddress;

import java.net.InetSocketAddress;

import java.net.Socket;


import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintWriter;


public class Client {

    public static void main(String[] args) throws Exception{


        Scanner sc;

        String addressString;

        int port =80;

        int timeoutMs = 30000;

        String temp;


        //Read address from commandline

        sc =new Scanner(System.in);

        System.out.print("Adresse: ");

        addressString = sc.next();

        sc.close();

        //Open socket

        InetAddress addr = InetAddress.getByName(addressString);

        SocketAddress sockaddr = new InetSocketAddress(addr, port);

        Socket socket = new Socket();


        //Connection timeout

        socket.connect(sockaddr,timeoutMs);


        System.out.println( socket.getPort() +"\n");


        //Define input/output

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);


        //Send GET request

        pw.print("GET / HTTP/1.1\r\n");

        pw.print("Host: "+ addressString +"\r\n\r\n");

        while((temp=br.readLine())!=null){

            System.out.println(temp);


        }

        //Close Input/Output and Socket

        pw.close();

        br.close();

        socket.close();

    }

}

代码似乎可以工作,直到它到达一段时间,然后我得到:


HTTP/1.0 408 Request Time-out

Server: AkamaiGHost

Mime-Version: 1.0

Date: Sun, 07 Oct 2018 15:36:40 GMT

Content-Type: text/html

Content-Length: 218

Expires: Sun, 07 Oct 2018 15:36:40 GMT


我不明白是什么导致了这个问题,已经在 stackoverflow、java2s 和我在家里得到的一本书上寻找答案。尝试其他页面通常以:


Process finished with exit code 0

没有别的。


知道我的请求缺少什么/不正确吗?


欣赏每一个提示。


HUX布斯
浏览 109回答 1
1回答

Helenr

PrintWriter具有用于存储数据的内部缓冲区,因此当您调用时print- 不会向服务器发送任何内容来自https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html与 PrintStream 类不同,如果启用自动刷新,则仅在调用println、printf或format方法之一时才会执行,而不是在碰巧输出换行符时执行。因此,您可以使用这些方法代替print或直接调用flush:pw.print("GET / HTTP/1.1\r\n");pw.print("Host: " + addressString + "\r\n\r\n");pw.flush(); // actually send data to server
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java