簡體   English   中英

Java:簡單客戶端服務器消息交換不起作用

[英]Java: Simple Client Server message exchange not working

我是Java的新手,昨天才剛開始。 我寫了一個非常簡單的客戶端服務器Java代碼。 客戶端向服務器發送消息。 服務器應顯示該消息。 並且服務器應在收到消息后向客戶端發送消息。 客戶端應顯示服務器發送的消息。

服務器代碼,

import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.net.Socket;
import java.net.ServerSocket;

public class CustomServer{
    public static void main(String[] args){
       final int SERVER_PORT_NUMBER = 8081;

       try{
         ServerSocket serverObj = new ServerSocket(SERVER_PORT_NUMBER);
         Socket clientSocketObj = serverObj.accept();
         BufferedReader clientInputStream = new BufferedReader(new InputStreamReader(clientSocketObj.getInputStream()));
         BufferedWriter clientOutputStream = new BufferedWriter(new OutputStreamWriter(clientSocketObj.getOutputStream()));

        if(clientSocketObj != null){
            System.out.println("Client Connected to Server!");

            // Recieve Message from Client
            System.out.println("MESSAGE FROM CLIENT");
            System.out.println(clientInputStream.readLine());

            // Send Message to Client
            clientOutputStream.write("SERVER: Hello Client!");

            // Close Streams
            clientOutputStream.close();
            clientInputStream.close();
        }
        serverObj.close();
    }
    catch(Exception e){
        System.out.println(e);
    }
}
}

客戶,

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;

public class CustomClient{
    public static void main(String[] args){
        final String HOST_NAME = "127.0.0.1";
        final int SERVER_PORT_NUMBER = 8081;

        try{
           Socket clientSocket = new Socket(HOST_NAME, SERVER_PORT_NUMBER);
           BufferedWriter clientOutputStream = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
           BufferedReader clientInputStream = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
           System.out.println("Connecting....");

        if(clientSocket != null){
            System.out.println("Connected to Server!");

            // Send message to Server
            clientOutputStream.write("CLIENT: HELLO SERVER");

            // Recieve message from Server
            System.out.println("MESSAGE FROM SERVER");
            System.out.println(clientInputStream.readLine());

            // Close Streams
            clientInputStream.close();
            clientOutputStream.close();
        }
        clientSocket.close();
    }
    catch(Exception e){
        System.out.println(e);
    }
}
}

服務器或客戶端均未收到該消息。 卡在某個循環中。 有人知道為什么嗎?

首先讀取BufferedReader的JavaDocs ,該狀態為

讀取一行文本。 一行被認為由換行符('\\ n'),回車符('\\ r')或回車符后立即換行符中的任何一個終止

BufferedWriter#write沒有發送此消息,因此閱讀器仍在等待。

一個簡單的解決方案可能是在write后使用BufferedWriter#newLine

而且,當您完成對緩沖區的寫操作時,請不要忘記刷新它!

您可能還想看一看try-with-resources ,它將提供更好的資源管理解決方案

CustomClient

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class CustomClient {

    public static void main(String[] args) {
        final String HOST_NAME = "127.0.0.1";
        final int SERVER_PORT_NUMBER = 8081;

        try (Socket clientSocket = new Socket(HOST_NAME, SERVER_PORT_NUMBER)) {
            try (BufferedWriter clientOutputStream = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
                    BufferedReader clientInputStream = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) {
                System.out.println("Connecting....");
                System.out.println("Connected to Server!");

                // Send message to Server
                clientOutputStream.write("CLIENT: HELLO SERVER");
                clientOutputStream.newLine();
                clientOutputStream.flush();

                // Recieve message from Server
                System.out.println("MESSAGE FROM SERVER");
                System.out.println(clientInputStream.readLine());
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

CustomServer

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class CustomServer {

    public static void main(String[] args) {
        final int SERVER_PORT_NUMBER = 8081;

        try (ServerSocket serverObj = new ServerSocket(SERVER_PORT_NUMBER)) {
            try (Socket clientSocketObj = serverObj.accept()) {
                try (BufferedReader clientInputStream = new BufferedReader(new InputStreamReader(clientSocketObj.getInputStream()));
                        BufferedWriter clientOutputStream = new BufferedWriter(new OutputStreamWriter(clientSocketObj.getOutputStream()))) {

                    System.out.println("Client Connected to Server!");

                    // Recieve Message from Client
                    System.out.println("MESSAGE FROM CLIENT");
                    System.out.println(clientInputStream.readLine());

                    // Send Message to Client
                    clientOutputStream.write("SERVER: Hello Client!");
                    clientOutputStream.newLine();
                    clientOutputStream.flush();
                }
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

暫無
暫無

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

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