我的java聊天服务器程序没有向每个连接的用户广播

时间:2016-07-19 07:57:53

标签: 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);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

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

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