java - 我的 Java 聊天服务器程序不会向每个连接的用户广播

标签 java server chat

我正在尝试建立一个简单的聊天客户端/服务器对,但遇到了困难。我基本上一切正常,除了当我在一个客户端上发送消息时,它仅发送回发送消息的客户端。

这是我的服务器代码:

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

public class ChatServer
{
    public static ServerSocket servSock;
    public static int port;
    protected List<ChatHandler> clients;

    public static void main(String[] args) throws IOException
    {
        System.out.println("Applegate Chat Server is now starting.");
        try
        {
            port = Integer.parseInt(args[0]);
            servSock = new ServerSocket(port);
            System.out.println("Now listening on port " + port + ".");
        }
        catch (ArrayIndexOutOfBoundsException e)
        {
            System.err.println("Usage: java ChatServer <port>");
            System.exit(0);
        }
        ChatServer w = new ChatServer();
        w.runServer();
    }

    public void runServer()
    {
        try
        {
            while (true)
            {
                Socket userSocket = servSock.accept();
                InetAddress userIP = userSocket.getInetAddress();
                System.out.println("Accepted connection from " + userIP.getHostName());
                ChatHandler ch = new ChatHandler(userSocket, userIP);
                clients = new ArrayList<>();
                synchronized (clients)
                {
                    clients.add(ch);
                }
                ch.start();
            }
        }
        catch (IOException e)
        {
            System.out.println("IO Exception in runServer: " + e);
        }
    }

    protected class ChatHandler extends Thread
    {
        protected Socket clientSock;
        protected BufferedReader in;
        protected PrintWriter out;
        protected InetAddress clientIP;
        protected String login;

        public ChatHandler(Socket sock, InetAddress clnt) throws IOException
        {
            clientSock = sock;
            clientIP = clnt;
            in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            out = new PrintWriter(sock.getOutputStream(), true);
        }

        public void run()
        {
            String line;
            try
            {
                while((line = in.readLine()) != null)
                {
                    out.println(line);
                }
            }
            catch (IOException e)
            {
                System.out.println("IO Exception: " + e);
            }
        }
    }
}

最佳答案

您每次接受连接时都会创建新的客户端列表。试试这个:

try
    {
        clients = new ArrayList<>(); // <---
        while (true)
        {
            Socket userSocket = servSock.accept();
            InetAddress userIP = userSocket.getInetAddress();
            System.out.println("Accepted connection from " + userIP.getHostName());
            ChatHandler ch = new ChatHandler(userSocket, userIP);
            synchronized (clients)
            {
                clients.add(ch);
            }
            ch.start();
        }
    }

此外,您还必须在 ChatServer 中创建函数,将收到的消息从一个客户端发送到所有其他客户端。

public void sendToAll(String msg) {
    synchronized (clients) {
        for (Socket c : clients){
            c.getOutputStream().write((msg + "\n").getBytes(_encoding));
            c.getOutputStream().flush();
        }
    }
}

下一步是修改 ChatHandler 线程以使用该函数:

protected class ChatHandler extends Thread
{
    protected Socket clientSock;
    protected BufferedReader in;
    protected PrintWriter out;
    protected InetAddress clientIP;
    protected String login;

    protected ChatServer server;  // <--

    public ChatHandler(Socket sock, InetAddress clnt, ChatServer server) throws IOException
    {
        this.server = server; // <--
        clientSock = sock;
        clientIP = clnt;
        in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
        out = new PrintWriter(sock.getOutputStream(), true);
    }

    public void run()
    {
        String line;
        try
        {
            while((line = in.readLine()) != null)
            {
                //out.println(line);
                server.sendToAll(line); // <--
            }
        }
        catch (IOException e)
        {
            System.out.println("IO Exception: " + e);
        }
    }
}

关于java - 我的 Java 聊天服务器程序不会向每个连接的用户广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38452601/

相关文章:

Java 位操作

java - 为什么 mongoTemplate 返回数字类型(int)列值是 double ?

java - 如何使用数据库导航器插件 intelliJ 连接到 mysql 服务器

ios - 无法快速在 PubNub 中找到添加监听器

javascript - 我创建了一个带有提交按钮的聊天框,但文本区域在单击提交按钮时失去了焦点

.net - 使用TCP或UDP套接字的VB 2008在线聊天应用程序

java - 在Java中切换对象数组中的最小值和最大值

java - 如何在 Findbugs 中使用 Checker Framework 注释?

ruby-on-rails - puma 启动导致 "There is already a server bound to: <socket>"错误

php - Symfony 2.7 : default timezone not set, 导致 fatal error