簡體   English   中英

如何從服務器向客戶端發送消息

[英]How to send message from server to client

我正在嘗試用Java編寫一個chatprogram,當我在客戶端發送消息時,服務器端會收到消息。 但是,當我從服務器端發送到客戶端時,它沒有收到消息。

我看不到我在做什么錯。

服務器端代碼:

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");
}

客戶端:

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);
        }
    });
}

希望有人可以幫助我解決這個問題。

您可以在每個println之后立即對PrintWriter執行刷新,甚至更好:使用autoFlush = true實例化PrintWriter:

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

這樣,每次調用printlnprintfformat ,PrintWriter都會在最后執行緩沖區刷新。

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

這條線總是在等待客戶端的output ,而且您的客戶端也不向server發送消息。

注意:您的serverclient均未讀取用戶輸入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM