聊天客户端应用程序未接收和发送任何数据



我得到了基本的客户端-服务器聊天应用程序。服务器端似乎可以工作,当我通过telnet连接它时,它会收到消息并将其发送回所有连接的客户端。我无法使用自己的客户端实现相同的目标。

所以从一开始,Server

public class Server  {
    private Properties properties;
    private ServerSocket serverSocket;
    private Set<ClientConnection> clientConnections;   
    public Server() throws IOException {
        clientConnections = new HashSet<>();
        serverSocket = new ServerSocket(9999);
        while(true){
            Socket clientSocket = serverSocket.accept();
            ClientConnection clientConnection = new ClientConnection(clientSocket, this);
            clientConnections.add(clientConnection);
            clientConnection.start();
        }
    }
    public Set<ClientConnection> getClientConnections() {
        return clientConnections;
    }
}

在每个连接上都会创建新的ClientConnection,在开始时,将"来自服务器的Hello"发送到新客户端(如果通过telnet连接则有效(,然后侦听所有传入的消息并将其广播到所有连接的客户端,再次 - 如果telnet是客户端,则工作。

public class ClientConnection extends Thread {
    private final Socket clientSocket;
    private final Server server;
    private OutputStream outputStream;
    private InputStream inputStream;    
    public ClientConnection(Socket clientSocket, Server server) {
        this.clientSocket = clientSocket;
        this.server = server;
    }
    @Override
    public void run(){
        try {
            handleClient();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private void handleClient() throws IOException {
        outputStream = clientSocket.getOutputStream();
        inputStream = clientSocket.getInputStream();
        outputStream.write("Hello from server".getBytes());
        System.out.println("New client connected");         
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String incomingMessage;
        while((incomingMessage = bufferedReader.readLine()) != null) {
            for(ClientConnection connection : server.getClientConnections()) {
                connection.getOutputStream().write(incomingMessage.getBytes());
            }
            System.out.println(incomingMessage);
        }
        clientSocket.close();
    }
    public OutputStream getOutputStream() {
        return outputStream;
    }
}

然后,我得到了ServerConnection类的客户端应用程序

    public class ServerConnection{
        private Socket socket;
        private OutputStream outputStream;
        private InputStream inputStream;
        private BufferedReader bufferedReader;
        private String host;
        private int port;
        public ServerConnection(String host, int port) {
            this.host = host;
            this.port = port;
        }
        public void connect() throws IOException {

        socket = new Socket(host, port);
        outputStream = socket.getOutputStream();
        inputStream = socket.getInputStream();
        outputStream.write("Hello from client".getBytes());
        bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String incommingMessage;
            while((incommingMessage = bufferedReader.readLine()) != null) {
                System.out.println(incommingMessage);
            }
        }
    }

它实际上是由服务器端注册的(打印"新客户端已连接"(,但它没有收到"来自客户端的 Hello",并且客户端没有从服务器接收任何消息。

请尝试在客户端的消息末尾发送新行,即:outputStream.write("Hello from clientrn".getBytes());,因为您在服务器代码中使用bufferedReader.readLine()。所以BufferedReader正在等待行尾,什么也没发生。

我不会为你编写代码,因为你有你需要的东西。但这里有一个流程,我自己花了一段时间才完全理解,这应该对你有所帮助。

服务器:

Start -> Accept connection -> Read InStream -> Write OutStream (FLUSH THE TOILET OF DATA) -> Loop

客户:

Start -> Connect -> Write OutStream (FLUSH THE TOILET OF DATA) -> Read InStream -> Close Connection

最新更新