Многопоточный сервер отвечает только одному клиенту одновременно

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 Project Framework?
  • 0
    Нет, я никогда не использовал его
Показать ещё 1 комментарий
Теги:
multithreading

1 ответ

1
Лучший ответ

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

public static Socket client;

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню