2016-08-31 2 views
1

Я попытался следующий код в качестве сервера для отправки сообщения для клиентов, чьи 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_Bind Я пробовал другие порты, но исключение остается тот же я пытался порты 8080, 8089,8086,8009,1234,8242,8006

Пожалуйста, помогите мне исправить это.

я примерил эту простую программу, и она показывает то же самое исключение

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

Вы работаете как сервер и клиент из одной виртуальной машины Java (то есть один главный для Buth) – Mordechai

+0

не оба в разных системах –

ответ

2

Причина заключается в том, что вы создаете сервер сокет внутри цикла Еогеасп. Таким образом, после первого раза, когда первый клиент обрабатывается и серверы создаются в первый раз, этот код снова пытается создать другой серверный сервер на том же порту в следующей обработке клиента, в результате чего возникает исключение привязки.

Решение состоит в том, чтобы создать отдельный сервер до цикла, который будет продолжать принимать клиентов внутри цикла 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(); 

Основываясь на вашем EDIT:

Вы снова создать свой ServerSocket внутри цикла! НЕ ДЕЛАЙТЕ !!! * Сделайте это в конструкторе (или каким-то другим способом).

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

Теперь, вызовите его из основного-метода на стороне сервера, как:

new ServerSide().start(); 
+0

Как я могу пройти через всех клиентов в списке –

+0

Теперь это доступ только к одному клиенту –

+0

@AntonyJoslin - Вы уже просматриваете клиентские сокеты в списке. Я предполагаю, что mSessions - это своего рода коллекция/список. Таким образом, вы обрабатываете клиентов в порядке их добавления в список. Вы уверены, что несколько клиентов запущены &&, вы добавили их в свою коллекцию/список, прежде чем принимать их? –

Смежные вопросы