2015-12-01 4 views
0

Я делаю программу чата java socket, и я сделал ее совместимой для нескольких подключений, и когда пользователь присоединяется к ней, она не отправляет сообщение «[пользователь]« всем », один, который подключен, но у меня есть поток для каждого клиента, если кто-нибудь скажет мне, почему он только отправляет сообщение пользователю, который недавно присоединился, я бы очень признателен. Вот код сервераjava socket несколько клиентов, не получающих сообщения

import java.io.*; 
import java.net.*; 
import java.util.ArrayList; 

public class server { 
public ObjectInputStream input; 
public ServerSocket server; 
public Socket s; 
public ObjectOutputStream output; 
public ArrayList<Socket> users = new ArrayList<Socket>(); 
public class Accept implements Runnable { 
    public void run() { 
     try { 
      server = new ServerSocket(55555, 100); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     while(true) { 
      try { 
       s = server.accept(); 
       users.add(s); 
       new EchoThread(s).start(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
public class EchoThread extends Thread { 
    private Socket sock; 
    public EchoThread(Socket s) throws IOException { 
     this.sock = s; 
     output = new ObjectOutputStream(sock.getOutputStream()); 
    } 
    public void run() { 
     System.out.println(sock.getInetAddress() + " Connected"); 
     try { 
      for(Socket s: users) { 
       output.writeObject(s.getInetAddress() + " Connected"); 
      } 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
    } 
} 
server() throws IOException { 
    Thread t = new Thread(new Accept()); 
    t.start(); 
} 
public static void main(String[] args) throws IOException { 
    new server(); 
} 
} 

ответ

0

Так, Каждый раз, когда кто-то подключается к серверу, у создать новый EchoThread. Каждый пользователь имеет свой собственный EchoThread.

Ваша роль сервера - управлять всеми EchoThreads и Sockets.

output.writeObject(s.getInetAddress() + " Connected"); 

Это сообщение отправляет только одному пользователю. Ваш сервер должен иметь список сокетов и отправки сообщений на каждые Sockets

public ArrayList<Socket> users = new ArrayList<Socket>(); 
public ArrayList<ObjectOutputStream> outputs = new ArrayList<ObjectOutputStream>(); 


public class Accept implements Runnable { 

    public void run() { 

     try { 
      server = new ServerSocket(55555, 100); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     while(true) { 
      try { 
       s = server.accept(); 
       users.add(s); 
       outputs.add(new ObjectOutputStream(s.getOutputStream())); 

       for (ObjectOutputStream o: outputs) { 
        o.writeObject(s.getInetAddress() + " has connected"); 
       } 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+0

я добавил, что в мой код, и он просто посылает пользователю сообщение о том, как когда-либо долго список, так что если список 7 долго он пошлет мне тот же самый msg 7 раз – mardis7021

+0

всего лишь небольшая ошибка ^^ это «s.getInetAdress», а не socket.getInetAdress »:) – MeGoodGuy

+0

он по-прежнему не отправляет сообщение всем пользователям – mardis7021

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