Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ChatClient & ChatServer проблема вывода, проблема отправки от сервера к клтенту 
:(
    Опции темы
pereZZZ
Дата 28.8.2016, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.8.2016

Репутация: нет
Всего: нет



Всем привет есть сервер с множеством подключений и клиент, которые должны просто переписываться между друг-другом, на сервер все доходит а вот для клиента обратно нет, не могу найти в чем проблема 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");
            }
        }
    }

}

PM MAIL   Вверх
LSD
Дата 30.8.2016, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15709
Регистрация: 24.3.2004

Репутация: 19
Всего: 537



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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
pereZZZ
Дата 30.8.2016, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.8.2016

Репутация: нет
Всего: нет



Цитата(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);
               


Это сообщение отредактировал(а) pereZZZ - 30.8.2016, 18:59
PM MAIL   Вверх
LSD
Дата 31.8.2016, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15709
Регистрация: 24.3.2004

Репутация: 19
Всего: 537



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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.1277 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.