为了账号安全,请及时绑定邮箱和手机立即绑定

带有 Java 套接字的 HTTP 客户端

带有 Java 套接字的 HTTP 客户端

HUX布斯 2021-11-03 15:54:07
我尝试在 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-outServer: AkamaiGHostMime-Version: 1.0Date: Sun, 07 Oct 2018 15:36:40 GMTContent-Type: text/htmlContent-Length: 218Expires: Sun, 07 Oct 2018 15:36:40 GMT我不明白是什么导致了这个问题,已经在 stackoverflow、java2s 和我在家里得到的一本书上寻找答案。尝试其他页面通常以:Process finished with exit code 0没有别的。知道我的请求缺少什么/不正确吗?欣赏每一个提示。
查看完整描述

1 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

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


查看完整回答
反对 回复 2021-11-03
  • 1 回答
  • 0 关注
  • 108 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信