我正在創建一個簡單的服務器/客戶端應用程序。服務器將socket.getInputStream()
包裝在Scanner
中。客戶端從System.in
獲取用戶輸入,並將其發送到服務器並使用PrintWriter
。服務器評估scanner.hasNext()
爲true,但會在以下scanner.next()
調用中阻塞。按照javadocs:java掃描程序塊在.next()時它不應該
即使先前調用hasNext()返回true,此方法也可能在等待輸入進行掃描時阻塞。
好吧..這是怎麼回事? 編輯:值得注意的是,當客戶端終止時,服務器現在繼續撥打scanner.next()
。額外的問題:客戶instanciates PrintWriter
與autoFlush
參數爲true
,但我需要在每次致電.write()
後刷新。爲什麼?下面是我的代碼的MCV:
import java.io.IOException;
import java.net.ServerSocket;
import java.util.Scanner;
public class MCVServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(1337);
Scanner fromClient = new Scanner(server.accept().getInputStream());
while (fromClient.hasNext()) {
System.out.println("server heard something: ");
System.out.println(fromClient.next());
}
}
}
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class MCVClient {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("localhost", 1337);
Scanner input = new Scanner(System.in);
PrintWriter output = new PrintWriter(socket.getOutputStream(), true);
while(true) {
output.write(input.next());
output.flush();
}
}
}
我不明白。由於流是'System.in',它永遠不會到達流的結尾,對吧?但爲什麼是'。next()'等待輸入?流中有東西。 – user2651804
在客戶端,由於System.in被實現(這是一個BufferedInputStream)的方式,需要讀取一個'\ n'字符以將其緩衝區刷新到Scanner對象。 – dliber