2015-05-03 69 views
1

我想編寫一個程序,允許用戶發送消息到服務器並接收該消息的修改版本。出於某種原因,程序的流程停在了下面的某一行,我已經指出了這一點。任何人都可以解釋爲什麼這不起作用嗎?謝謝。Java客戶端/服務器應用程序不會readLine()

服務器端

import java.net.*; 
import java.io.*; 


public class Server{ 

    public final static int port = 1025; 

    public static void main (String[] args){ 

     ServerSocket serverSocket; 
     Socket client; 
     PrintWriter output; 

     try{ 
      serverSocket = new ServerSocket(port); 
      try{ 
       while(true){ 
        client = serverSocket.accept(); 
        InputStream is = client.getInputStream(); 
        InputStreamReader isr = new InputStreamReader(is); 
        BufferedReader br = new BufferedReader(isr); 
        String message = br.readLine(); 
        System.out.println("Message received from client is " + message); 

        String returnMessage = message + message; 

        OutputStream os = client.getOutputStream(); 
        OutputStreamWriter osw = new OutputStreamWriter(os); 
        BufferedWriter bw = new BufferedWriter(osw); 
        bw.write(returnMessage); 
        System.out.println("Message sent to the client is " + returnMessage); 
        bw.flush(); 
       } 
      } catch(IOException e){ 
       serverSocket.close(); 
       System.err.println(e); 
      } 
     } catch(IOException e){ 
      System.err.println(e); 
     } 
    } 
} 

客戶端

import java.util.Scanner; 
import java.net.*; 
import java.io.*; 

class Client{ 

    public void getService(String destination, int port){ 
     try{ 
      while(true) 
      { 
       Scanner in = new Scanner(System.in); 
       System.out.println("Send a message to the server: "); 
       String message = in.nextLine(); 


       Socket server = new Socket(destination, port); 

       OutputStream os = server.getOutputStream(); 
       OutputStreamWriter osw = new OutputStreamWriter(os); 
       BufferedWriter bw = new BufferedWriter(osw); 


       String sendMessage = message + "\n"; 
       bw.write(sendMessage); 
       bw.flush(); 
       System.out.println("Message sent to the server : "+ sendMessage); 


       InputStream is = server.getInputStream(); 
       InputStreamReader isr = new InputStreamReader(is); 
       BufferedReader br = new BufferedReader(isr); 
       String message2 = br.readLine(); // I have determined that the program's flow proceeds no further than this line 
       System.out.println("Message received from the server : " + message2); 

      } 
     } catch(IOException e){ 
      e.printStackTrace(); 
     } 

    } 

    public static void main(String[] args){ 
     String serverAddress = args[0]; 
     System.out.println(serverAddress); 

     Client client = new Client(); 
     client.getService(serverAddress, 1025); 
    } 
} 

回答

2

服務器使用BufferedReader,其readLine方法需要行結束符,但客戶不能發送它 - 相反,它讀取該行(剝離行分隔符的結尾)並嘗試回顯此消息。在客戶端發送的數據中追加一個新的行字符,以便服務器的readLine方法在等待該行時不會阻止:

String returnMessage = message + message + "\n"; 
相關問題