0

我有一个聊天室,在控制台中运行。服务器通过线程使用支持多个客户端。当我运行它时,服务器然后是客户端,客户端连接正常。我通过客户端程序发送消息“hello”,客户端打印出消息,表明服务器收到消息(这是服务器本意要做的)。但是当我同时运行另一个客户端时,我在一个客户端上发送了一条消息,但该消息没有打印在另一个客户端上。为什么会这样?没有错误,客户端连接正常。

问候 Bl-H

我会根据要求发布代码。

好的,这是服务器向客户端发送消息的代码(这是线程类的方法):

public void run() {
            PrintStream output = null;
            BufferedReader input = null;
            String message;
            try {
                //i/o for clients:
                output = new PrintStream(server.getOutputStream());
                input = new BufferedReader(new InputStreamReader(server.getInputStream()));
            } catch (IOException ioe) {
                System.err.println(ioe);
                System.exit(1);
            }

            while(true) {
                try {
                    message = input.readLine();
                    output.println(message);
                } catch (IOException ioe) {
                    System.err.println(ioe);
                    System.exit(1);
                }
            }
        }
4

2 回答 2

1

在服务器端,当您为每个客户端创建一个线程时,您需要有一个 HandleClient 类(它实现 Runnable 接口),您必须在其中取回 PrintWriter(每个客户端的)。每个 PrintWriter 都象征着您的服务器和一个客户端之间的连接。您只需要创建一个 ArrayList PrintWriter(它将代表您的客户),然后对其进行循环并执行类似的操作(不完全记得)

public void transferMessagetoAll(PrintWriter sender)
{
    for(i=0;i<PrintWriterArray.size();i++)
    {
        if(PrintWriterArray.get(i) != sender)
        {
             PrintWriterArray.get(i).println("something");
        }
    }
}

此外,您应该将客户端“发送者”PrintWriter 设置为transferMessagetoAll() 方法的参数,以便您可以将消息从发送者传递给除他之外的所有其他人。

我已经发布了这种 java 软件(带有 UI)。当我下班回来时,我可以将我的个人源代码发送给您(无论如何,这是一个学者项目)。

于 2012-06-14T07:29:43.557 回答
0

您可以使用 hashmap 将所有客户放在那里HashMap<String, DataOutputStream> clients = new HashMap<String, DataOutputStream>();

public void run() {
    try {
        dis = new DataInputStream(s.getInputStream());
        dos = new DataOutputStream(s.getOutputStream());
        while (true) {
            dos.writeBytes("enter nick: ");
            name = dis.readLine().trim();
            if (chatters.get(name) != null) {
                dos.writeBytes("nick has already been taken..."+n);
            } else {
                break;
            }
        }
        chatters.put(name, dos);
        sendToAll(name+" entered the chatroom... chat away"+n+n);
        sendToAll(name+" exited the chatroom...");
        chatters.remove(name);
        dos.close();
        dis.close();
        s.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

顺便说一句,这里是private static final String n = "\r\n";

于 2013-02-06T12:37:11.503 回答