Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > ChatClient & ChatServer проблема вывода


Автор: pereZZZ 28.8.2016, 16:58
Всем привет есть сервер с множеством подключений и клиент, которые должны просто переписываться между друг-другом, на сервер все доходит а вот для клиента обратно нет, не могу найти в чем проблема smile 


ServerChat
Код

public class ServerChat {
    public static Thread StartServerT=new Thread(new StartServer());
    public static Thread ServerSOutT=new Thread(new ServerSOut());
    public static Thread ExitT=new Thread(new Exit());
    public static LinkedList<DataInputStream> LLin=new LinkedList<DataInputStream>();
    public static LinkedList<DataOutputStream> LLout=new LinkedList<DataOutputStream>();
    public static LinkedList<Socket> LLS=new LinkedList<Socket>();
    public static ServerSocket ss;
    public static boolean check=true;
    public static boolean ChekIn=false;
    public static int port=6666;
    public static int num=0;
    public static int in=0;
    public static String line=null;

    public static void main(String[] args) {
        try {
            System.out.println("Server start work");
            ss = new ServerSocket(port);
            StartServerT.setPriority(6);
            StartServerT.start();
            ExitT.setPriority(8);
            ExitT.start();
        }catch (IOException e){
            System.out.println("Server not run");
        }
    }

    public static class StartServer implements Runnable {       
        @Override
        public void run() {
            try{
                System.out.println("Client connect run");
                while (true){                                                       //ждем подключения от клиентов
                    Socket socket=ss.accept();
                    LLS.add(socket);
                    if(socket.isConnected()) {
                        OutWriteSocket();     //для каждого клиента создаем DataInputStream и DataOutputStream
                        System.out.println("Client connect " + socket.getInetAddress());
                    }
                }
            }catch (IOException e){
                System.out.println("StartServer error");
            }
        }

        public void OutWriteSocket() {
            try {
                InputStream inIS = (LLS.get(num)).getInputStream();
                OutputStream outIS=(LLS.get(num)).getOutputStream();
                DataInputStream ind=new DataInputStream(inIS);
                DataOutputStream outd=new DataOutputStream(outIS);
                LLin.add(ind);       //записываем все в LinkedList
                LLout.add(outd);
                num=num+1;
                System.out.println("Number of client "+in);
                in=in+1;
                Thread ServerSInT=new Thread(new ServerSIn()); //новый поток для одного клиента для приема данных
                ServerSInT.start();       //запускаем его
                if(!ServerSOutT.isAlive()){
                    ServerSOutT.start();   //запускаем поток для вывода
                }
            }catch (IOException e){
                System.out.println("OutWriteSocket error");
            }
        }
    }

    public static class ServerSIn implements Runnable {  //поток ввода
        @Override
        public void run() {
            try{
                System.out.println("ServerSIn run");
                int w=in-1;
                while (true){
                    line=LLin.get(w).readUTF();   //принемаем данные
                    ChekIn=true;  //при значении true поток вывода начинает проверять значение  line и отпровлять его
                }
            }catch (IOException e){
                System.out.println("ServerSIn error");
            }
        }
    }

    public static class ServerSOut implements Runnable {
        @Override
        public void run() {
            try{
                System.out.println("ServerSOut run");
                while (true){
                    if(ChekIn) {
                        for(int i=0; i<LLout.size();i++){
                            LLout.get(i).writeUTF(line);  /*вот это не работает хотя должен на все DataOutputStream 
                            System.out.println(line);     отпровлять значение line*/
                            //LLout.get(i).flush();
                        }
                    }
                }
            }catch (IOException e){
                System.out.println("ServerSOut error");
            }
        }
    }

    private static class Exit implements Runnable {
        @Override
        public void run() {
            try{
                BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
                System.out.println("If you want off server write - 'exit'");
                while(check) {
                    String line =reader.readLine();
                    if(line.equals("exit")){
                        StartServerT.stop();
                        System.out.println("Server Stop");
                        check=false;
                    }
                }
            }catch (IOException e){
                System.out.println("You dont maik off server");
            }
        }
    }

}

Автор: LSD 30.8.2016, 18:23
Потому что логика работы на сервере неправильная. После соединения клиента с сервером, его коннект кладется в LLS и на этом все.

Автор: pereZZZ 30.8.2016, 18:58
Цитата(LSD @ 30.8.2016,  18:23)
Потому что логика работы на сервере неправильная. После соединения клиента с сервером, его коннект кладется в LLS и на этом все.


Я использую LLS для создания InputStream и OutputStream и заношу его в LLout и LLin. После на каждый LLout отправляю что придёт на один из LLin. А LLS потом где его ещё использовать?


Код

 public void OutWriteSocket() {
            try {
                InputStream inIS = (LLS.get(num)).getInputStream();
                OutputStream outIS=(LLS.get(num)).getOutputStream();
                DataInputStream ind=new DataInputStream(inIS);
                DataOutputStream outd=new DataOutputStream(outIS);
                LLin.add(ind);    
                LLout.add(outd);
               

Автор: LSD 31.8.2016, 11:39
Когда ты делаешь ServerSocket.accept() ты получаешь сокет который связан с конкретным клиентским соединением. Все эти сокеты независимы друг от друга и от родительского ServerSocket.
Т.е. у тебя есть 2 потока обмена информацией (туда и обратно), для каждого клиента. Ну и дальше надо строить работу соответствующим образом.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)