多线程聊天-服务器仅向一个客户端发送消息

时间:2020-09-26 19:20:14

标签: java sockets websocket

我正在使用套接字制作一个终端聊天应用程序。对于此应用程序,我有两个文件:Server.java和Client.java。该程序是这样工作的。

  1. 打开三个终端
  2. 一个终端用于启动服务器。其他两个终端用于启动两个客户端(可以有无限数量的客户端,但是为了演示,我们只选择两个客户端)
  3. 客户端连接到服务器后,客户端可以向服务器提交消息
  4. 客户端向服务器提交邮件后,服务器将收到该邮件,并将其发送给所有客户端

问题

现在,我在向所有客户端发送消息时遇到问题。目前,邮件仅发送给提交邮件的客户端。

实施

我正在通过将所有客户端放入一个数组列表中来鼓励该功能向所有客户端发送消息。 客户端提交消息后,我有一个for循环,该循环遍历客户端的arraylist并将消息发送给所有客户端。此功能在sendAll方法中实现。

Server.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import java.net.*;
import java.io.*;
import java.util.*;

public class Server {

    public static ArrayList<ClientHandler> clients = new ArrayList<ClientHandler>();

    public static void main(String[] args) {

        ServerSocket server = null;

        try {
            server = new ServerSocket(32000);
            server.setReuseAddress(true);

            // The main thread is just accepting new connections
            while (true) {
                Socket client = server.accept();
                System.out.println("New client connected " + client.getInetAddress().getHostAddress());
                ClientHandler clientSock = new ClientHandler(client);

                // The background thread will handle each client separately
                new Thread(clientSock).start();

                // Add Client to arraylist
                clients.add(clientSock);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (server != null) {
                try {
                    server.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    public static void sendAll(String line) {
        for(int i = 0; i < clients.size(); i++) {
            clients.get(i).out.println(line);
        }
    }

    private static class ClientHandler implements Runnable {

        private final Socket clientSocket;

        public static PrintWriter out = null;
        public static BufferedReader in = null;

        public ClientHandler(Socket socket) {
            this.clientSocket = socket;
        }

        @Override
        public void run() {
            try {
                out = new PrintWriter(clientSocket.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

                String line;
                while ((line = in.readLine()) != null) {
                    System.out.printf("Sent from the client: %s\n", line);
                    sendAll(line);                   
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                    if (in != null)
                        in.close();
                    clientSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Client.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client {

    public static void main(String[] args) {

        String host = "127.0.0.1";
        int port = 32000;
        
        try (Socket socket = new Socket(host, port)) {
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            Scanner scanner = new Scanner(System.in);
            String line = null;
            while (!"exit".equalsIgnoreCase(line)) {
                line = scanner.nextLine();
                out.println(line);
                out.flush();
                System.out.println("Server replied " + in.readLine());
            }
            scanner.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

0 个答案:

没有答案
相关问题