HTTP-клиент с сокетами Java - PullRequest
       3

HTTP-клиент с сокетами Java

0 голосов
/ 07 октября 2018

Я пытаюсь открыть TCP-сокет в Java и отправить запрос GET на сервер (www.abc.net.au) и распечатать ответ на консоль.

Код клиента:

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

<HTML><HEAD>
<TITLE>Request Timeout</TITLE>
</HEAD><BODY>
<H1>Request Timeout</H1>
The server timed out while waiting for the browser's request.<P>
Reference&#32;&#35;2&#46;3d5b6068&#46;1538926600&#46;0
</BODY></HTML>

Process finished with exit code 0

Я не понимаю, в чем причина проблемы, уже искал ответы на stackoverflow, java2s и книгуя добрался до домаПопытка других страниц часто заканчивается просто:

Process finished with exit code 0

и ничем иным.

Есть идеи, что отсутствует / неверно в моем запросе?

Оцените каждый намек.

1 Ответ

0 голосов
/ 07 октября 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...