2015-08-20 32 views
5

Próbuję utworzyć chatprogram w Javie, kiedy wysyłam wiadomość po stronie klienta, po stronie serwera pojawia się komunikat. Ale kiedy wysyłam od strony serwera do klienta, nie otrzymuję wiadomości.Jak wysłać wiadomość z serwera do klienta

Nie widzę, co robię źle.

Serwer kodu po stronie:

private void serverStart(){ 
    textArea.append("Starting server " + " \n"); 

    try { 
     serverSocket = new ServerSocket(4444); 
     textArea.append("Waiting for Clients " + " \n"); 

     //Reading message from the client 
     socket = serverSocket.accept(); 

     textArea.append("Client Connected " + "\n"); 

     //Send message to client 
     out = new PrintWriter(socket.getOutputStream()); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     while (true) 
     {   

      messageFromClient = in.readLine(); 
      whileChat(messageFromClient); 
     } 
    } catch(IOException ioExecption) { 
     ioExecption.printStackTrace(); 
    } 
} 

private void whileChat(String messageFromClient) { 
    showMessage(messageFromClient); 
    System.out.println("Message from client : " + messageFromClient); 
} 

protected static void showMessage(final String message) { 
    SwingUtilities.invokeLater( 
    new Runnable(){ 
     public void run() 
     { 
      Gui.consoleTextArea.append(message + "\n"); 
     } 
    }); 
} 

public static void sendMessage(String message) { 
    out.println(message); 
    showMessage(name + " : " + message + "\n"); 
} 

stronie klienta:

private void connectToServer() { 

    try { 
     socket = new Socket("localhost", 4444); 
    } catch (UnknownHostException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

    Thread clientThread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       // attach to socket's output stream with auto flush turned on 
       //Send message to the server 
       out = new PrintWriter(socket.getOutputStream(), 
         true); 

       //Get return message from server 
       in = new BufferedReader(new InputStreamReader(
         socket.getInputStream())); 
       messageFromServer = in.readLine(); 
       whileChatting(messageFromServer); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
    clientThread.start(); 
} 

private void whileChatting(String messageFromServer) { 
    showMessage(messageFromServer); 
    System.out.println("Message from server to client " + messageFromServer); 
} 

public static void Send(String msg) { 
    out.println(name + " : " + msg); 
    showMessage(name + " : " + msg + "\n"); 
} 
protected static void showMessage(final String message) { 
    SwingUtilities.invokeLater( 
    new Runnable(){ 
     public void run(){ 
      Gui.consoleTextArea.append(message); 
     } 
    }); 
} 

nadzieję, że ktoś może mi pomóc z tym problemem.

+0

Czy widzisz komunikat "Klient podłączony"? – slartidan

+0

Zadzwonienie do 'out.flush()' natychmiast po napisaniu może pomóc. –

+0

Tak Widzę komunikat związany z klientem, out.flush call jest wymagane, gdy masz true w PrintWriter? – tinaw25

Odpowiedz

3

Można wykonać kolor na PrintWriter natychmiast po każdym println, albo jeszcze lepiej: przykład PrintWriter z autoFlush = true:

out = new PrintWriter(socket.getOutputStream(), true); 

W ten sposób każdej chwili zadzwonić println, printf lub format , PrintWriter wykona płukanie bufora na końcu.

+0

Dziękuję bardzo za pomoc. Nie widziałem, że zapomniałem prawdziwej wartości w obiekcie PrintWriter :-) – tinaw25

+0

Nie ma za co! –

1
in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

Linia ta jest zawsze czeka klienta output, a klient również nie wysyła wiadomość do server.

Uwaga: zarówno dane użytkownika server, jak i client nie odczytują danych wprowadzonych przez użytkownika.

Powiązane problemy