我可以使用套接字列表发送到多个客户端吗?

时间:2015-03-04 10:55:22

标签: java list sockets server

我有一个ArrayList<Socket> listOfSockets,当我收到clientsocket = serversocket.accept()这样listOfSockets.add(clientsocket)时会添加一个套接字 然后我把这整个列表发送给另一个这样的类。

Server_Client client = new Server_Client(clientSock, clientSocketList);
                    Thread X = new Thread(client);
                    X.start();

以下是我将列表和套接字发送到

的类的代码
public class Server_Client implements Runnable{
//ArrayList<String> UserNameList;
ArrayList<Socket> clientSocketList;
Socket socket = null;

public Server_Client(Socket X, ArrayList<Socket> L){
    this.socket = X;
    this.clientSocketList = L;
}


@Override
public void run() {
    try {

        ListenforMessage NewMessages = new ListenforMessage(socket);
        Thread myThread = new Thread(NewMessages);
        myThread.start();            
    } catch (Exception e) {
        System.err.println(e);
    }
}
//------------------------------------------------------------------
//Class that handles incoming messages!
class ListenforMessage implements Runnable{
    Socket socket;
    DataInputStream IN;
    DataOutputStream OUT;
    public ListenforMessage(Socket x) {
        this.socket = x;
    }

    @Override
    public void run() {
        try {
            while (true) {                    
                    IN = new DataInputStream(socket.getInputStream());
                    OUT = new DataOutputStream(socket.getOutputStream());
                    String message = IN.readUTF();
                    //System.out.println(message);
                    for (Socket TEMP_SOCK : clientSocketList) {
                        if(TEMP_SOCK != this.socket){ 
                            SendMessage(message);
                        }
                    }
                }                                                  
        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }
    }                        

}

public void SendMessage(String m) throws IOException{
    try {            
        DataOutputStream OUT = new DataOutputStream(socket.getOutputStream());
        OUT.writeUTF(m);
        System.out.println("User said: " + m);
    } catch (Exception e) {
    }

}
//------------------------------------------------------------------
}

ListenforMessage类中,在for循环中,我会使用list的大小,如果TEMP_SOCK不是this.socket,那么我想向该套接字发送一条消息,并且如果它是那么不做任何事情。但我的问题是,当我与2个客户端连接时,他们无法向对方发送消息。他们只是将消息发送到服务器,服务器将消息发送回客户端。我的问题是,你能否像我这样使用一个列表来检查套接字是不是你自己的套接字。

因为现在Client1发送消息并从服务器接收相同的消息,而Client2也做同样的事情。 我希望Client1发送和Client2接收消息(和同一列表上的其他套接字)

1 个答案:

答案 0 :(得分:2)

您的代码不起作用,因为您应该让SendMessage知道它应该向哪个套接字发送消息(即您应该将TEMP_SOCK传递给它),而是让它使用socket变量,它是连接到刚刚发送消息的客户端的套接字。