Вот пример на основе 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. разберитесь с методами и коментами к ним очень внимательно, а потом уже вешайте на кнопочки. |