2016-04-21 42 views
-2

我正在學習一些Java套接字編程,並設法在服務器和客戶端之間建立我的第一個連接。這引發了我的好奇心:如果不是「連接」和「消息接收」消息而是我做了一種「聊天室」類型的事情,而服務器和客戶端輸入是相互打印的,會發生什麼?所以我試着這樣做。關於Java套接字和打印流的好奇心

現在,我知道這是沒有辦法的辦法聊天室創建(我可能會需要線程和諸如此類的東西),但我很好奇,爲什麼這不工作:

服務器:

public void run() throws Exception 
{ 
    boolean isChatting = true; 
    Socket clientSocket = new Socket("localhost", 444); 

    PrintStream ps = new PrintStream(clientSocket.getOutputStream()); 
    ps.println("Connected."); 

    BufferedReader bfr = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
    BufferedReader bfrClient = new BufferedReader(new InputStreamReader(System.in)); 

    String serverMessage = bfr.readLine(); 
    String clientMessage; 

    System.out.println("Server: "+serverMessage); 

    while (isChatting) 
    { 
     clientMessage = bfrClient.readLine(); 
     ps.println(clientMessage); 

     if (clientMessage.toUpperCase().equals("EXIT")) 
     { 
      isChatting = false; 
     } 
    } 

    bfr.close(); 
    bfrClient.close(); 
} 

客戶:

public void run() throws Exception 
{ 
    boolean isChatting = true; 
    ServerSocket server = new ServerSocket(444); //Port 
    Socket sSocket = server.accept(); 
    PrintStream ps = new PrintStream(sSocket.getOutputStream()); 

    BufferedReader bfr = new BufferedReader(new InputStreamReader(sSocket.getInputStream())); 
    BufferedReader bfrPersonal = new BufferedReader(new InputStreamReader(System.in)); 

    String clientMessage = bfr.readLine(); 
    String messageToSend; 
    System.out.println("Client: "+clientMessage); 

    if (clientMessage != null) 
    { 
     ps.println("Connected."); 
    } 

    while (isChatting) 
    { 
     messageToSend = bfrPersonal.readLine(); 
     ps.println(messageToSend); 

     if (messageToSend.toUpperCase().equals("EXIT")) 
     { 
      isChatting = false; 
     } 
    } 

    bfr.close(); 
    bfrPersonal.close(); 
} 

謝謝您的時間! :)

+0

「這沒用」?呃...你有例外嗎?哪一個在哪裏?學習在其他事情之前進行調試 –

+0

雙方都不能發送消息,直到消息從對方顯示出來爲止。這是一個僵局。如果你使用阻塞套接字,你*絕對*必須使用線程來創建一個聊天程序。 –

+0

@DenysSéguret我該如何調試一些從字面上什麼都不做的事情?該程序只是坐在那裏等待大聲笑... –

回答

-1

如果您想創建聊天系統,最簡單的方法是在服務器上創建兩個線程,在客戶端創建兩個線程。

  • 第一個線程處理用戶的輸入併發送它。

  • 第二個線程處理來自其他聊天系統的輸入並進行打印。

+0

你不需要兩條線程來處理這個問題;你只需要一個。 – AlBlue