【问题标题】:Can I use a list of sockets to send to multiple clients?我可以使用套接字列表发送到多个客户端吗?
【发布时间】:2015-03-04 10:55:21
【问题描述】:

我有一个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 循环中,我会遍历列表的大小,如果 TEMP_SOCK 不是 this.socket,那么我想向该套接字发送消息,如果是则不要不做任何事。但我的问题是,当我与 2 个客户端连接时,他们无法互相发送消息。他们只是将消息发送到服务器,然后服务器将消息发送回客户端。我的问题是,您能否像我一样使用列表来检查套接字是否不是您自己的套接字。

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

【问题讨论】:

  • 问题#1:你到底为什么要创建一个启动(临时)线程然后终止的线程?这将使您的子线程无法管理。
  • ListenforMessage 应该实现Runnable,而不是扩展Thread
  • 哦,是的,我的错。我现在在我的代码中有这个。我只是添加了它以查看它是否有任何改变(它没有)
  • 你的代码是一个巨大的设计混乱。您应该查找一个示例,其中应该有很多(毕竟您基本上是在描述一个聊天服务器)。如果你试图继续这样做,它不会有好的结局。
  • 这是一个学校项目,这意味着在我获得更多使用此类代码的经验或至少不会在任何产品上之前,我不会实现它。我只需要帮助找出问题,而不是你的居高临下:)

标签: java list sockets server


【解决方案1】:

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

【讨论】:

  • 谢谢!就是这么简单:)
猜你喜欢
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
相关资源
最近更新 更多