Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从服务器向列表中的多个客户端发送消息_Java_Sockets_Network Programming_Bind_Serversocket - Fatal编程技术网

Java 如何从服务器向列表中的多个客户端发送消息

Java 如何从服务器向列表中的多个客户端发送消息,java,sockets,network-programming,bind,serversocket,Java,Sockets,Network Programming,Bind,Serversocket,我曾尝试使用以下代码作为服务器向ip位于列表mSession中的客户端发送消息 for (MSession mSession : mSessions) { System.out.println("Inside for each"); System.out.println("IP TEST : " + mSession.getRemote_Addr()); ServerSocket srvr = new ServerSocket(1324, 5, InetAddress.getB

我曾尝试使用以下代码作为服务器向ip位于列表mSession中的客户端发送消息

for (MSession mSession : mSessions)
{
   System.out.println("Inside for each");
   System.out.println("IP TEST : " + mSession.getRemote_Addr());
   ServerSocket srvr = new ServerSocket(1324, 5, InetAddress.getByName(mSession.getRemote_Addr()));
   Socket skt = srvr.accept();
   System.out.println("IP1:" + InetAddress.getByName(mSession.getRemote_Host()));
   System.out.println("IP2:" + skt.getInetAddress().getHostAddress());           
   System.out.print("Server has connected!\n");
   PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
   System.out.print("Sending string: '" + data + "'\n");
   out.print(data);
   out.close();
   skt.close();
   srvr.close();                                         
}
客户端代码:

InetAddress ip = InetAddress.getByName(host[0]);
System.out.println("IP SERVER : " + ip);
Socket skt = new Socket(ip, 1324);// Ip address of server
in = new BufferedReader(new InputStreamReader(skt.getInputStream()));
System.out.print("Received string: ");

while (!in.ready()) {}
data = in.readLine();
System.out.println(in.readLine());

System.out.print("'\n");
Popupapp app = new Popupapp();
app.fdis(data);
in.close();
skt.close();
我收到bindexception无法分配请求的地址:JVM\u Bind 我尝试了其他端口,但例外情况保持不变 我尝试了端口80808980868009123482428006

请帮我把这个修好

我试过这个简单的程序,它显示了相同的异常

public class ServerSide extends Thread{

public void run()
{
    while(true)
    {
        String data = "Recieved new notification";
        try {

             ServerSocket srvr = new ServerSocket(1234, 5, InetAddress.getByName("192.168.168.40"));
             Socket skt = srvr.accept();

             skt.getInputStream();

             System.out.print("Server has connected!\n");
             PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
             System.out.print("Sending string: '" + data + "'\n");
             out.print(data);
             out.close();
             skt.close();
             srvr.close();
             Thread.sleep(500);



      }

   catch(Exception e) {
      System.out.print("Whoops! It didn't work!\n" + e);
      try {
        Thread.sleep(1000);
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
   }

}
}

原因是您正在foreach循环内创建服务器套接字。因此,在第一次之后,当处理第一个客户端并且第一次创建serversocket时,此代码再次尝试在下一次客户端处理中在同一端口上创建另一个serversocket,从而导致绑定异常

解决方案是在循环之前创建一个单独的serversocket,它将继续在foreach循环中接受客户机。如下图所示:

ServerSocket srvr = new ServerSocket(1324, 5, InetAddress.getByName(mSession.getRemote_Addr()));
for (MSession mSession : mSessions)
              {
                  System.out.println("Inside for each");
                  System.out.println("IP TEST : " + mSession.getRemote_Addr());
                  // start accepting client-requests                     
                  Socket skt = srvr.accept();
                  System.out.println("IP1:" + InetAddress.getByName(mSession.getRemote_Host()));
                  System.out.println("IP2:" + skt.getInetAddress().getHostAddress());            
                  System.out.print("Server has connected!\n");
                  PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
                  System.out.print("Sending string: '" + data + "'\n");
                  out.print(data);
                  out.close();
                  skt.close();                                     
              }
                // finally close the server-socket!                
                  srvr.close(); 

根据您的编辑:

您再次在循环中创建ServerSocket不要*在构造函数中执行(或在其他方法中)

现在,从服务器端的main方法调用它,如下所示:

new ServerSide().start();

您是否从一个JVM同时运行服务器和客户端(即,一个主JVM用于buth)不,两者都在不同的系统中显示我可以查看列表中的所有客户端吗现在只访问一个client@AntonyJoslin-您已通过列表中的客户端套接字。我假设mSessions是某种集合/列表。因此,您处理客户机的顺序是如何将其添加到列表中。在接受多个客户端之前,是否确实有多个客户端正在运行&您已将它们添加到集合/列表中?我将在每个循环中使用此选项访问列表会话中的所有客户端。是的,客户端正在侦听
new ServerSide().start();