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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отправка сообщ. клиент на клиет (сокет)! Как можно соеденить несколько клиеты? 
V
    Опции темы
KISha
Дата 18.2.2010, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Народ помогите !
Для того чтобы отправить сообщение (соеденить более 3-х клиетов) какие действие требуется?   smile (типа как М-агент)

в данны момент у меня сервер и клиет, хотел еще добавить несклько клиентов.
СЕРВЕР
...
    void run()
    {
        try{
            providerSocket = new ServerSocket(2004, 10);
            System.out.println("Waiting for connection");
            connection = providerSocket.accept();
            System.out.println("Connection received from " + connection.getInetAddress().getHostName());
            out = new ObjectOutputStream(connection.getOutputStream());
            out.flush();
            in = new ObjectInputStream(connection.getInputStream());
            sendMessage("Connection successful");
            //4. The two parts communicate via the input and output streams
                while (true)
                {
                try{
                    message = (String)in.readObject();
                    System.out.println("client>" + message);
                    Scanner in1 = new Scanner(System.in);        
                    String messageq = in1.next();
                    sendMessage(messageq);
                     }
                catch(ClassNotFoundException classnot){System.err.println("Data received in unknown format");
                }
                
        
        }
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
        finally{
            //4: Closing connection
            try{
                in.close();
                out.close();
                providerSocket.close();
            }
            catch(IOException ioException){
                ioException.printStackTrace();
            }
        }
    }
    void sendMessage(String msg)
    {
        try{
            out.writeObject(msg);
            out.flush();
            System.out.println("server>" + msg);
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
    }
Клиент 
...
    void run()
    {
        try{
            requestSocket = new Socket("localhost", 2004);
            System.out.println("Connected to localhost in port 2004");
            out = new ObjectOutputStream(requestSocket.getOutputStream());
            out.flush();
            in = new ObjectInputStream(requestSocket.getInputStream());

        Scanner in1 = new Scanner(System.in);
       while (true)
        {                
            try{
                    
                    message = (String)in.readObject();
                    System.out.println("server>" + message);
                
                System.out.println("Enter to send message server");                
                String messageq = in1.next();
                sendMessage(messageq);
                }
                catch(ClassNotFoundException classNot){
                    System.err.println("data received in unknown format");
                }
                
           }
                
        //    }while(!message.equals("bye"));
        }
        catch(UnknownHostException unknownHost){
            System.err.println("You are trying to connect to an unknown host!");
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
        finally{
            //4: Closing connection
            try{
                in.close();
                out.close();
                requestSocket.close();
            }
            catch(IOException ioException){
                ioException.printStackTrace();
            }
        }
    }
    void sendMessage(String msg)
    {
        try{
            out.writeObject(msg);
            out.flush();
            System.out.println("client>" + msg);
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
    }


PM MAIL   Вверх
tarakashka
Дата 1.10.2010, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот пример на основе SSLSocket, много чего тут не понятного может, но идея заключается в том что мы записываем поток каждого клиента в список, а потом когда нужно отправить сообщения всем то через цыкл "for" проходим все потоки)
Код

public class SSLmain extends Thread{
String temp="", mesage="",tosendtemp="";
//temp-основная переменная куда записываються все сообщения
int i=0,port=0,count=0,s=0;
SSLSocket sslClientSocket;
SSLServerSocket sslServerSocket;
Boolean flagserver=false,con=false,start=true,serwait=false;
BufferedReader br;
OutputStream out;
InputStream in;
thread th,tp;
List <thread> list=new LinkedList<thread>();//список клиентов(потоков клиентов)
   // конструктор
    public SSLmain() {
        start();//старт потока
    }
//создать сервер
    void startserver(int port){
try {
           // Получить экземпляр хранилища ключей.
            KeyStore keyStore = KeyStore.getInstance("JKS");
            FileInputStream fis = new FileInputStream("ServerKeyStore");
            keyStore.load(fis, "8311635".toCharArray());
            // Получить диспетчеры ключей базовой реализации для заданного хранилища ключей.
            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
            keyManagerFactory.init(keyStore, "8311635".toCharArray());
            KeyManager [] keyManagers = keyManagerFactory.getKeyManagers();
            // Получить доверенные диспетчеры базовой реализации.
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
            trustManagerFactory.init(keyStore);
            TrustManager [] trustManagers = trustManagerFactory.getTrustManagers();
            // Получить защищенное случайное число.
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG", "SUN");
            // Создание SSL контекста
            SSLContext sslContext = SSLContext.getInstance("SSLv3");
            sslContext.init(keyManagers, trustManagers, secureRandom);

            // Создание фабрики SSL сокетов.
            javax.net.ssl.SSLServerSocketFactory sslSocketFactory =
                    sslContext.getServerSocketFactory();

            System.out.println("Creating Server Socket :"+InetAddress.getLocalHost());
            sslServerSocket = (SSLServerSocket)
            sslSocketFactory.createServerSocket(port);
            sslServerSocket.setNeedClientAuth(true);
            // Далее работаем как с обычным сокетом.
            System.out.println("Start Listenning Server Socket...");
        } catch (Exception ex) {
            Logger.getLogger(SSLmain.class.getName()).log(Level.SEVERE, null, ex);
        }
           flagserver=true;
           //con=true;
    }
    //отсойдениться от сервера
void disconSSLServer(){
        try {
            th=null;
            sslClientSocket.close();
            sslServerSocket.close();
            temp="";mesage="";tosendtemp="";
            i=0;port=0;count=0;s=0;
            for(int i=0;i<list.size();i++)
            {
                tp=list.get(i);
                tp.currentThread().stop();
            }
            list=new LinkedList<thread>();

            flagserver=false;con=false;start=true;serwait=false;
            s--;//если клиент отсоиденился ждем нового
        } catch (Exception ex) {
            Logger.getLogger(SSLmain.class.getName()).log(Level.SEVERE, null, ex);
        }
}
//подсоидениться к серверу(клиент-соиденение)
void SSLClient(String ip,int port){
    this.port=port;
            // Получить экземпляр хранилища ключей.
         try{   KeyStore keyStore = KeyStore.getInstance("JKS");
            FileInputStream fis = new FileInputStream("ClientKeyStore");
            keyStore.load(fis, "8311635".toCharArray());

            // Получить диспетчеры ключей базовой реализации для заданного хранилища ключей.
            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
            keyManagerFactory.init(keyStore, "8311635".toCharArray());
            KeyManager [] keyManagers = keyManagerFactory.getKeyManagers();

            // Получить доверенные диспетчеры базовой реализации.
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
            trustManagerFactory.init(keyStore);
            TrustManager [] trustManagers = trustManagerFactory.getTrustManagers();
            // Получить защищенное случайное число.
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG", "SUN");
            // Создание SSL контекста
            SSLContext sslContext = SSLContext.getInstance("SSLv3");
            sslContext.init(keyManagers, trustManagers, secureRandom);
            // Создание фабрики SSL сокетов.
            javax.net.ssl.SSLSocketFactory sslSocketFactory =
                    sslContext.getSocketFactory();
            // Создаем сокет.
            System.out.println("Creating Server Socket : "+InetAddress.getLocalHost());
             sslClientSocket = (SSLSocket) sslSocketFactory.createSocket(ip,port);

            System.out.println("Test connection complite successfully");
con=true;
         }catch(Exception ex){
         System.out.println(ex.getMessage());}
}
//отправить сообщение
void sendmeseg( String str){
    if(flagserver)//если сервер посылает сообщения
    for(int i=0;i<list.size();i++)
    try {
                out =list.get(i).sslcok.getOutputStream();
                tosendtemp = str+"\n";
                byte b[] = tosendtemp.getBytes();
                out.write(b);
                out.flush();
               //System.out.println(tosendtemp);
                    } catch (Exception ex) {
             System.out.println(ex.getMessage());
        }
    else //если клиент хочет послать сообщение
        try {
                out =sslClientSocket.getOutputStream();
                tosendtemp = str+"\n";
                byte b[] = tosendtemp.getBytes();
                out.write(b);
                out.flush();
               //System.out.println(tosendtemp);
                    } catch (Exception ex) {
             System.out.println(ex.getMessage());
        }
}
//отправка сообщения всем клинтам от клиента который присылает сообщ.
void sendmes( String str,thread th){
    if(flagserver)//если сервер посылает сообщения
    for(int i=0;i<list.size();i++)
    try {
        //если это тот клиент который отправил сообщ. то пропускаем его
   if(th.equals(list.get(i)))System.out.println(th.getName());
                else{
       //другие клиенты получат сообщения от отправщика-клиента
                out =list.get(i).sslcok.getOutputStream();
                tosendtemp = str+"\n";
                byte b[] = tosendtemp.getBytes();
                out.write(b);
                out.flush();
                    }
         } catch (Exception ex) {
             System.out.println(ex.getMessage());
        }
    }

//старт потока
    @Override
    public synchronized void run() {
       s=0;
         while(start)
        try {

         Thread.currentThread().sleep(50);
         tosendtemp="";
         //если начал роботу сервер выполняем след операции
            if (flagserver)   {
                try {


                    while(count>s){//ждем подключения всех клиентов
                   System.out.println("wait connetion ");
                   serwait=true;
                   SSLSocket ssltempsoc = (SSLSocket)sslServerSocket.accept();
                    sslClientSocket=ssltempsoc;
                    br = new BufferedReader(new InputStreamReader(sslClientSocket.getInputStream()));
                    th=new thread(br,sslClientSocket);//создание отдельного потока для клинта
                    list.add(th);//запись клиента для слежения за вх. его сообщениями
                    s++;

                   }
                    serwait=false;//флаг различия когда к
                                  //серверу подсоиденились все клиенты или нет
                     resiv(th);

                } catch (Exception ex) {
                    System.out.println(ex.getMessage());
                }
                               }
         //конец кода для сервера*

         //если начал работать клиент
           if(con)
                   {
               //здесь идет чтения входящих сообщений
               br = new BufferedReader(new InputStreamReader(sslClientSocket.getInputStream()));
          while((s=br.read())!=-1)
                                    {
                     temp+=String.valueOf((char)s);
                     if(String.valueOf((char)s).equals("\n"))System.out.println(temp);
                                    }

                   }
         //конец кода выполнения для клиента*
            } catch (Exception ex) {
            Logger.getLogger(SSLmain.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
//получение сообщения в реж. ожидания клиентов
    String resiv(thread th){
        tosendtemp="";
        for(int i=0;i<list.size();i++){
                     th=list.get(i);
                      tosendtemp+=th.temp;
                      if(!th.temp.equals(""))
                      sendmes(tosendtemp,th);
                     }
                    if(!tosendtemp.equals(temp) || tosendtemp.equals(""))
                    {
                        temp+=tosendtemp;
                    }
    return temp;
    }


////////////////////////////////////////////////////////////////
public class thread extends Thread{
BufferedReader bf;
int s,i=0;
String temp="",col="";
SSLSocket sslcok;
Boolean flag=false;
OutputStream out;

byte buf;
//конструктор для запоминания потока данных и адреса сокета
    public thread(BufferedReader bfr,SSLSocket sslsoc) {
        try {
            bf = bfr;
            sslcok = sslsoc;

            start();
        } catch (Exception ex) {
            Logger.getLogger(thread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
//старт потока
    @Override
  public void run() {
        while(true)//чтение сервером всех клинтских потоков
        try {
            while ((s = bf.read()) != -1) {

                //если встречается переход на другую строку
//это не обязательно просто удобней так мне
                if (String.valueOf((char) s).equals("\n")) {
                    System.out.println(col);
                    temp+=col+"\n";
                    col="";
                    System.out.println(temp);
                    Thread.currentThread().sleep(100);
/*главное ставьте столько сколько у вас все потоки ждут иначе белиберда будет.
 sleep ставились что бы не нагружать проц цыклами бесконечными.       */                                                                    
                    temp="";
                }

            }
        } catch (Exception ex) {
            System.out.println( ex.getMessage()+"22");
        }

                   }

    @Override
    public void destroy() {
        Thread.currentThread().stop();
    }

    }

P.S. разберитесь с методами и коментами к ним очень внимательно, а потом уже вешайте на кнопочки.
PM MAIL   Вверх
KISha
Дата 17.12.2010, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



тут много чего то не понятно, как клиент хочу отправить через сервер сообщение к другому клиету , мысль  вопрос был тоакой, как это сделать помогите,
мне один -два пример хватает,  если можно приведите примеры по Datagram,

например:
клиет1 отправляет сообщение (через сервер) на клиент2 , т.е сообщение сначало попадает в сервер и потом на клиент2.
вот этого нужно мне сделать. помогите  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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