java socket多个客户端没有接收消息

时间:2015-12-01 22:13:09

标签: java sockets

我正在制作一个java套接字聊天程序,我使它兼容多个连接,当用户加入它时,它不会发送消息" [user]加入"所有客户只是连接到一个,但我有一个线程为每个客户端,如果有人可以告诉我为什么它只是发送消息给最近加入的用户我会非常感激。这是服务器代码

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

public class server {
public ObjectInputStream input;
public ServerSocket server;
public Socket s;
public ObjectOutputStream output;
public ArrayList<Socket> users = new ArrayList<Socket>();
public class Accept implements Runnable {
    public void run() {
        try {
            server = new ServerSocket(55555, 100);
        } catch (IOException e) {
            e.printStackTrace();
        }
        while(true) {
            try {
                s = server.accept();
                users.add(s);
                new EchoThread(s).start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
public class EchoThread extends Thread {
    private Socket sock;
    public EchoThread(Socket s) throws IOException {
        this.sock = s;
        output = new ObjectOutputStream(sock.getOutputStream());
    }
    public void run() {
        System.out.println(sock.getInetAddress() + " Connected");
        try {
            for(Socket s: users) {
                output.writeObject(s.getInetAddress() + " Connected");
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}
server() throws IOException {
    Thread t = new Thread(new Accept());
    t.start();
}
public static void main(String[] args) throws IOException {
    new server();
}
}

1 个答案:

答案 0 :(得分:0)

所以, 每当有人连接到服务器时,您都会创建一个新的EchoThread。 每个用户都有自己的EchoThread。

您的服务器角色是管理所有EchoThreads和套接字。

 output.writeObject(s.getInetAddress() + " Connected");

这仅向一个用户发送消息。 您的服务器应该有一个套接字列表并向每个套接字发送消息

public ArrayList<Socket> users = new ArrayList<Socket>();
public ArrayList<ObjectOutputStream> outputs = new ArrayList<ObjectOutputStream>();


public class Accept implements Runnable {

    public void run() {

        try {
            server = new ServerSocket(55555, 100);
        } catch (IOException e) {
            e.printStackTrace();
        }

        while(true) {
            try {
                s = server.accept();
                users.add(s);
                outputs.add(new ObjectOutputStream(s.getOutputStream()));

                for (ObjectOutputStream o: outputs) {
                    o.writeObject(s.getInetAddress() + " has connected");
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}