2014-09-10 2 views
0

Кто-нибудь знает, что случилось с моим кодом?
Когда я пишу что-то с client1, я просто вижу его на сервере и на клиенте1, но не на client2.Java: Я не получаю сообщения от других клиентов?

пробег() в Client.java:

public void run() { 
     Scanner input = new Scanner(System.in); 

     try { 

      Socket client = new Socket(host, port); 

      System.out.println("client started"); 

      OutputStream out = client.getOutputStream(); 
      PrintWriter writer = new PrintWriter(out); 

      InputStream in = client.getInputStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 

       String i = input.nextLine(); 
       writer.write(clientname + ": " + i + newline); 
       writer.flush(); 

       String s = null; 

       while((s = reader.readLine()) != null) { 

        System.out.println(s); 

       } 

      writer.close(); 
      reader.close(); 
      client.close(); 

     } 

Если вам нужен код сервера или что-нибудь еще просто спросить.
Спасибо заранее!

Дополнительно Сервер:

public class Server { 

    public static void main(String[] args) { 
     int port = 40480; 
     int max = 10; 

     ExecutorService executor = Executors.newFixedThreadPool(max); 

     try { 
      ServerSocket server = new ServerSocket(port); 
      System.out.print("server started" + "\n"); 

      while(true) { 

       try { 
        Socket client = server.accept(); 

        executor.execute(new Handler(client)); 

       } 

       catch (IOException e) { 
        e.printStackTrace(); 

       } 

      } 

     } catch(Exception e) { 
      e.printStackTrace(); 

     } 

    } 

} 

И Handler:

public class Handler implements Runnable{ 

    private Socket client; 

    public Handler(Socket client) { 
     this.client = client; 

    } 

    @Override 
    public void run() { 

     try { 

      OutputStream out = client.getOutputStream(); 
      PrintWriter writer = new PrintWriter(out); 

      InputStream in = client.getInputStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 

      String s = null; 

      while((s = reader.readLine()) != null) { 

       writer.write(s + "\n"); 
       writer.flush(); 

       System.out.println(s); 

      } 

      writer.close(); 
      reader.close(); 
      client.close(); 

     } 

     catch(Exception e) { 


     } 

    } 

} 
+2

Да, нам нужно с кодом сервера – ControlAltDel

+0

Done! Его выше. – Jonathan

ответ

1

Это пример - он не является полным, но должен дать вам представление о том, как вы можете многоадресный вывод на несколько слушающих клиентов. Есть лучшие способы сделать это, но я написал это, похожее на то, как вы, похоже, делаете сокеты. Во многих местах также отсутствует проверка ошибок, и я оставил это как упражнение для читателя. Этот код также был написан так, чтобы его можно было использовать на Java 1.6 или выше.

В коде используется список подключенных Клиентов, хранящихся в объекте Server. Когда вход поступает от одного клиента, вывод является многоадресным для каждого клиента в списке клиентов. Запись выполняется методом записи в классе Client.

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.LinkedList; 
import java.util.Iterator; 
import java.util.List; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class MulticastEchoServer { 
    List<Client> clientList = new LinkedList<Client>(); 
    ExecutorService executor; 

    int port = 40480; 
    int max = 10; 

    public MulticastEchoServer() { 
     this.executor = Executors.newFixedThreadPool(max); 
    } 

    public void writeToAllClients(String string) throws IOException { 
     // Multiple threads access this so it must be in synchronized block 
     synchronized (this.clientList) { 
      Iterator<Client> iter = this.clientList.iterator(); 
      while (iter.hasNext()) 
       iter.next().write(string); 
     } 
    } 

    public void addClient(Client client) { 
     // Multiple threads access this so it must be in synchronized block 
     synchronized (this.clientList) { 
      clientList.add(client); 
     } 
    } 

    public void removeClient(Client client) { 
     // Multiple threads access this so it must be in synchronized block 
     synchronized (this.clientList) { 
      clientList.remove(client); 
     } 
    } 

    public void listen() { 
     try { 
      ServerSocket server = new ServerSocket(port); 
      System.out.println("server started and listening for connections"); 

      while (true) { 
       try { 
        Socket socket = server.accept(); 
        System.out.print("connection accepted" + "\n"); 

        Client newClient = new Client(this, socket); 

        this.addClient(newClient); 
        this.executor.execute(newClient); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     new MulticastEchoServer().listen(); 
    } 

    private class Client implements Runnable { 

     Socket socket; 
     PrintWriter writer; 
     BufferedReader reader; 
     MulticastEchoServer server; 

     public Client(MulticastEchoServer server, Socket socket) throws IOException { 
      this.server = server; 
      this.socket = socket; 
      this.writer = new PrintWriter(this.socket.getOutputStream()); 
      this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     } 

     synchronized public void write(String string) throws IOException { 
      writer.write(string); 
      writer.flush(); 
     } 

     public void close() { 
      this.writer.close(); 
      try { 
       this.reader.close(); 
      } catch (IOException e) { 
      } 
      try { 
       this.socket.close(); 
      } catch (IOException e) { 
      } 
     } 

     @Override 
     public void run() { 
      System.out.println("Client Waiting"); 

      String inString = null; 
      try { 
       while ((inString = this.reader.readLine()) != null) { 
        this.server.writeToAllClients(inString + "\n"); 
        System.out.println(inString); 
       } 
      } catch (IOException e1) { 
      } 

      server.removeClient(this); 
      this.close(); 
      System.out.println("Client Closed"); 
     } 
    } 

} 
+0

Спасибо, человек! Это помогло понять clientList! – Jonathan

0

В обработчике:

while((s = reader.readLine()) != null) { writer.write(s + "\n"); writer.flush(); System.out.println(s); }

Вы только записать строку обратно отправителю, не для всех подключенных разъемов

+0

Знаете ли вы, как это сделать? – Jonathan

+0

Ваш сервер должен поддерживать список клиентов. Затем, когда сервер получает данные от клиента, сервер должен будет перебрать все клиенты и выпустить запись для каждого из них. –

+0

взгляните на это: http://docs.oracle.com/javase/7/docs/api/java/nio/channels/package-summary.html – ControlAltDel

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