2016-08-31 1 views
1

j'avais essayé le code suivant comme serveur pour envoyer un message aux clients dont ip est la liste msessionComment envoyer un message à plusieurs clients dans une liste de serveur

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();           
} 

Le code côté client:

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(); 

Je reçois BindException peut assigner l'adresse demandée: JVM_Bind J'ai essayé d'autres ports, mais l'exception reste le même j'avais essayé les ports 8080, 8089,8086,8009,1234,8242,8006

S'il vous plaît aidez-moi à résoudre ce problème.

J'avais essayé sur ce programme simple et il montre même exception

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(); 
    } 
    } 

} 
} 
+0

Êtes-vous en cours d'exécution à la fois serveur et client d'une machine virtuelle Java (soit un principal Buth) – Mordechai

+0

pas deux sont dans différents systèmes –

Répondre

2

La raison est que vous créez socket serveur dans la boucle foreach. Ainsi, après la première fois, lorsque le premier client est traité et que la socket servers est créée pour la première fois, ce code tente à nouveau de créer une autre socket serveur sur le même port dans le traitement client suivant, entraînant l'exception bind.

La solution consiste à créer une socket servers séparée avant la boucle, qui continuerait à accepter les clients dans la boucle foreach. Il est indiqué ci-dessous:

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(); 

Sur la base de votre EDIT:

Vous créez votre nouveau ServerSocket dans la boucle! NE PAS FAIRE !!! * Faites-le dans le constructeur (ou dans une autre méthode).

public class ServerSide extends Thread{ 

public ServerSide(){ 
ServerSocket srvr = new ServerSocket(1234, 5, InetAddress.getByName("192.168.168.40")); 
} 
public void run() 
{ 
while(true) 
{ 
    String data = "Recieved new notification"; 
    try {    
     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(); 
} 
} 

Maintenant, appelez-le à partir de votre méthode principale sur le côté serveur comme:

new ServerSide().start(); 
+0

Comment puis-je passer en revue tous les clients de la liste? –

+0

Maintenant, cela n'accède qu'à un seul client –

+0

@AntonyJoslin - Vous parcourez déjà les sockets client dans la liste. Je suppose que mSessions est une sorte de collection/liste. Ainsi, vous traitez les clients dans l'ordre de leur ajout dans la liste. Êtes-vous sûr que plusieurs clients s'exécutent && vous les avez ajoutés dans votre collection/liste, avant de les accepter? –