2014-11-26 2 views
1

Я хочу создать многопоточный сервер, который одновременно разговаривает с несколькими клиентами. это проблема:сервер многопоточно отвечает только на одного клиента сразу

  • Сервер может отвечать только на одного клиента одновременно. Я не могу отправить ничего от второго клиента, если первый не получил ответа сервера.

это код моего сервера:

import java.io.*; 
import java.net.*; 



public class Serveur extends Thread{ 


    private MyFrame mf; 
    @SuppressWarnings("unused") 
    private FileAttente file; 
    private ServerSocket serveur ; 



    public Serveur(int port,MyFrame f,FileAttente file) throws IOException{ 

     serveur = new ServerSocket(port); 
     this.mf = f; 
     this.file=file; 
    } 



    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     mf.console.append("\nServeur en écoute ... "); 
     while(true){ 
      try { 

       SoClient threadClient = new SoClient(this.serveur.accept()); 
       threadClient.start(); 
       mf.console.append("\nUn nouveau client s'est connecté"); 

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



     } 
     } 






} 

У меня есть эта строка: mf.console.append("\nUn nouveau client s'est connecté"); выполняется после приема каждого сообщения от клиента. Обычно он должен выполняться только тогда, когда приходит новый клиент.

это код гнезда, где я поставил все операции между клиентом и сервером:

import java.io.DataInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.Socket; 


public class SoClient extends Thread { 

     static MyFrame mf; 
     FileAttente file; 
     public static Socket client; 
     public SoClient(Socket client){ 
      this.client=client; 
     } 



     public void run(){ 

      MyFrame.console.append("\nConnexion établi : "+client.getInetAddress()); 
      //Envoie et reception 
      try { 
       InputStream in = this.client.getInputStream(); 
       OutputStream out = client.getOutputStream(); 

       sleep(2); 

       DataInputStream is = new DataInputStream(in); 
       @SuppressWarnings("deprecation") 
       String request = is.readLine(); 
       MyFrame.console.append("\nMessage d'un Client :"+request); 
       DataInputStream din = new DataInputStream(in); 
       sleep(2); 
       String chaine_Client=din.readUTF(); 
       MyFrame.console.append("Client :"+chaine_Client); 
       client.close(); 
      } catch (IOException | InterruptedException e) {} 
     } 




    } 

Итак, что я хочу сделать, это отправка широковещательного сообщения с сервера для всех клиентов, которые подключены или отправлены эхо-сообщение. Для клиента я создал класс, и я создаю его столько времени, сколько захочу. Класс Client и классы серверов находятся в двух проектах diffirents в Eclipse.

+0

Вы пробовали использовать рамки проекта Netty? – HCarrasko

+0

Нет, я никогда не использовал его – Somar

+0

Вы заглянули в RMI для своего сервера? Он обрабатывает одновременное обращение нескольких клиентов на сервер. Для другого пути (трансляции) вашим клиентам также потребуется экспортировать удаленный объект. – edharned

ответ

1

Вы определили клиент класса переменной в SoClient как статические:

public static Socket client; 

и установить его в конструкторе.

Если у вас несколько экземпляров SoClient, все они работают с одним и тем же клиентом-Socket.
Это может вызвать более странные ошибки.

Удалите статическое ключевое слово и оно, надеюсь, работает.

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