我嘗試在 Java 中打開(kāi) TCP 套接字并向服務(wù)器 (www.abc.net.au) 發(fā)送 GET 請(qǐng)求并將響應(yīng)打印到控制臺(tái)??蛻?hù)端代碼: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(); }}代碼似乎可以工作,直到它到達(dá)一段時(shí)間,然后我得到: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我不明白是什么導(dǎo)致了這個(gè)問(wèn)題,已經(jīng)在 stackoverflow、java2s 和我在家里得到的一本書(shū)上尋找答案。嘗試其他頁(yè)面通常以:Process finished with exit code 0沒(méi)有別的。知道我的請(qǐng)求缺少什么/不正確嗎?欣賞每一個(gè)提示。
1 回答

Helenr
TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊
PrintWriter具有用于存儲(chǔ)數(shù)據(jù)的內(nèi)部緩沖區(qū),因此當(dāng)您調(diào)用時(shí)print- 不會(huì)向服務(wù)器發(fā)送任何內(nèi)容
來(lái)自https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html
與 PrintStream 類(lèi)不同,如果啟用自動(dòng)刷新,則僅在調(diào)用println、printf或format方法之一時(shí)才會(huì)執(zhí)行,而不是在碰巧輸出換行符時(shí)執(zhí)行。
因此,您可以使用這些方法代替print或直接調(diào)用flush:
pw.print("GET / HTTP/1.1\r\n");
pw.print("Host: " + addressString + "\r\n\r\n");
pw.flush(); // actually send data to server
添加回答
舉報(bào)
0/150
提交
取消