URL: https://linuxfr.org/users/kennux/journaux/source-client Title: Source Client Authors: kennux Date: 2003年12月15日T17:06:25+01:00 Tags: Score: 0 /** * Chat avance Java. * 27.10.2003 * @author Remi Wipliez && Raphael Mariage * @version 0.0 */ import java.io.InputStreamReader; import java.io.BufferedReader; import java.net.DatagramSocket; import java.net.DatagramPacket; import java.net.InetAddress; import java.lang.Thread; public class ClientUDP { static int lg, serv_port, taille_buff=10240, test = 1; static String address_serv, receive, chaine, login= "", mdp, mdp2, newcl, mess, passcrypte, log; static String[] info = new String[2]; static DatagramPacket dp; static DatagramSocket ds; static BufferedReader kbr; static boolean not_connected = true; static byte[] buffer = new byte[taille_buff]; static InetAddress adr; public static void main(String [] args) { /* on commence la detection des arguments * avec comme arguments possibles, l'addresse * du serveur et le port */ lg = args.length; if (lg != 0) { for (int i=0;i<lg;i++) { if (args[i].charAt(0) == '-') { try { switch(args[i].charAt(1)) { case 'p': { serv_port = Integer.parseInt(args[i+1]); break; } case 's': { address_serv = args[i+1]; break; } default:{ System.out.println("Option inconnue : " + args[i]); System.out.println("Options possibles : "); System.out.println("-p : definir un port "); System.out.println("-s : definir adresse du serveur"); System.exit(0); } } } catch(ArrayIndexOutOfBoundsException e) { System.out.println("Argument manquant..."); System.exit(0); } } } } else { /* adresse et port par defaut */ address_serv = "localhost"; serv_port = 2222; } /* Fin de la detection des arguments */ ds = ConnectUDP.dsocket(0); System.out.println("Identification"); while (login.length() == 0) { System.out.println("Nickname (10 caracteres max) : "); System.out.println("Si vous ne vous etes jamais connecte, tapez new + votre login"); kbr = new BufferedReader(new InputStreamReader(System.in)); try { login = kbr.readLine(); if (login.length() != 0) { if (login.substring(0,3).equals("new")) { login = login.substring(4,login.length()); mess = "new" + "@> @" + login; buffer = mess.getBytes(); } else buffer = login.getBytes(); adr = InetAddress.getByName(address_serv); dp = ConnectUDP.dpacket(buffer, buffer.length, adr, serv_port); ConnectUDP.envoi(ds, dp, adr, serv_port); break; } else { System.out.println("login nul"); System.out.println("veuillez entrer un login correct"); } } catch(java.io.IOException e) { System.out.println("erreur IO"); } } /* procedure d'identification et de connexion au server * la connexion est autoris?e par la reception de la chaine "ok" lorsque l'identification est valide * c'est a dire bon pass, nouvelle inscription correcte...*/ log = login; login = Identification.Identification(log, adr, serv_port, ds); System.out.println("Bienvenue " + login + " !"); System.out.println("Version du 09/12/2003"); System.out.println("Nouvelles fonctionnalit?s disponibles..."); System.out.println("Tapez /help pour une liste des commandes..."); /* 2 threads, un d'ecoute des reponse du server * l'autre pour envoyer des messages au server */ new Sendmess(address_serv, serv_port, login, ds); new Ecoute(ds, serv_port, address_serv, test, login); } } class Sendmess extends Thread { private String sentMessage=""; private BufferedReader kbr; private InetAddress S_ia; private String adr, mess, login, newnick; private int ports; private DatagramPacket dp; private DatagramSocket ds; static boolean chang_run; public Sendmess(String address_serv, int serv_port, String log, DatagramSocket datas) { adr = address_serv; ports = serv_port; login = log; ds = datas; start(); } public void run() { /* on se mets en attente de message tant que le client ne dit pas qu'il veut quitter */ while(!sentMessage.equals("/exit")) { kbr = new BufferedReader(new InputStreamReader(System.in)); try { sentMessage = kbr.readLine(); S_ia = InetAddress.getByName(adr); } catch(java.io.IOException e) { System.out.println("erreur IO"); } String cmde=""; String mess=""; int index = 0; /* on detecte si c'est une commande afin de pouvoir surtout reperer le changement de login, * qui doit se faire apres l'enoie de la commande /nick */ if (sentMessage.charAt(0) == '/') { while (sentMessage.charAt(index) != ' ') { cmde = cmde + sentMessage.charAt(index); index ++; if (index == sentMessage.length()) break; } } /* si on chnage de pseudo, on recupere le nouveau */ if (cmde.equals("/nick")) newnick = sentMessage.substring(6, sentMessage.length()); index = 0; mess = login + "@> @" + sentMessage; byte [] buffer = mess.getBytes(); dp = ConnectUDP.dpacket(buffer, mess.length(), S_ia, ports); ConnectUDP.envoi(ds, dp, S_ia, ports); /* si l'utilisateur a decide de changer, on l'a deja dit au server, dc on effectue le changement */ if (cmde.equals("/nick")) login = newnick; if (cmde.equals("/passwd")) { try { Ecoute.sleep(100); } catch(java.lang.InterruptedException f) { System.out.println("erreur pause"); } chang_run = true; Identification.chang(login, S_ia, ports, ds); chang_run = false; } } System.exit(0); } } class Ecoute extends Thread { static private DatagramSocket datas; static private DatagramPacket datap; static private int taille_buff = 10240; static int sport, oktorun; static String adrs, reponse, login; static InetAddress S_ia; public Ecoute(DatagramSocket ds, int port, String adr, int test, String log) { login = log; oktorun = test; datas = ds; sport = port; try { S_ia = InetAddress.getByName(adr); } catch(java.io.IOException e) { System.out.println("erreur IO"); } start(); } public void run() { while(oktorun != 0) { byte buff_rep[] = new byte[taille_buff]; DatagramPacket dp = ConnectUDP.dpacket(buff_rep, taille_buff, S_ia, sport); reponse = ConnectUDP.recep(datas, dp); //System.out.println("Ecoute a recu " + reponse); if (reponse.equals("kickage")) { System.out.println("vous avez ete ejecte du server par l'administrateur"); System.exit(0); } else if (!Sendmess.chang_run) System.out.println(reponse); // reponse = ""; } } }