Fejlesztése kliens-szerver chat java

rövid leírása

Abban a pillanatban befejezni 2. Universtiteta természetesen az egyik a laboratóriumi munka Java csevegési sebesség írt. Miután megértette a téma aljzatok, tárgy sorozatprogramozásának az MVC, szeretném megosztani az olvasókkal, különösen azért, mert segített hihetetlenül az írás projekt.

És, persze, én úgy a tévedések és kihagyások, amelyet be kell jelenteni.

Egy kis elmélet

Tehát, hogy kezdődik. A projekt két részből áll: a kliens és szerver. Az ügyfél lesz GUI írt Swing könyvtárban. GUI szerver lesz nem csak a log-fájlt, és egy kis kimenő a konzol.

Írni csevegés, szükségünk van némi tudást.

Mivel mi a kapcsolat a kliens és a szerver fog megvalósulni segítségével aljzatok, megismerkednek velük közelebb.

Aljzatok (a foglalat angol -. Recess dugó) - a név a szoftver interfész közötti adatcserére folyamatokat. Aljzat - egy absztrakt objektum, amely a kapcsolat végpontja.

Minden folyamatot hozhatnak létre Socket (szerver socket), és összeköti azt bármilyen operációs rendszert port. Hallgató folyamat általában készenléti ciklus, vagyis, felébred, amikor egy új kapcsolatot.

Számunkra ez azt jelenti, hogy a kiszolgáló figyel minden port (a nagyobb rugalmasság szempontjából, akkor a port a konfigurációs fájlban), majd a kliens kapcsolatot, majd rávenni, hogy bizonyos intézkedéseket.

Átadás tárgyakat a hálózati

Ne beszéljünk a előnyeiről és hátrányairól minden megközelítés. Használjuk a második kiviteli alak. (És ha szükséges, valamivel később, írok egy második)

Szóval, mi az objektum szerializációs.

Szerializációs - transzfer folyamat egy adatstruktúrában egy bitsorozatot. A hátránya, hogy lépéssel szerializációs van deserialization működése - helyreállítása a kezdeti állapot az adatszerkezet a bitszekvencia.

Szerializációs átviteléhez használt tárgyak a hálózaton keresztül, és mentse őket a fájlokat.

A Java, az egyetlen dolog, amire szüksége sorosításához egy tárgy - megvalósítja az Serializable felület, amely egy marker felület, azaz nem tartalmaz semmilyen módszer.

Írás szerverek

Tehát, egy rövid leírást a szerver.

A szerver fut egy örök körforgás. Amint egy új ügyfél csatlakozik, létrehoz vele dolgozni egy új szál értesíti az ügyfelek már csatlakoztatva van az új felhasználót, és a kezdő küld egy bizonyos számú legutóbbi üzeneteket a chat. Az ügyfél, ha csatlakozunk bejelenti magát néhány informatsiiyu, valamint minden olyan üzenet, amely azonosítja, amit az imént csatlakozott.

De azon túl, nem szabad elfelejteni, hogy a vásárlók is ki van kapcsolva. Ez azt jelenti, meg kell, hogy rendszeresen közlik az ügyfelekkel jelek (ping'ovat egymást), úgy, hogy ha egy ügyfél bontja a vonalat (vagy szerver) minden kiderült róla.

Vágjunk bele. Hozzunk létre az első osztályú

Ó, igen, azt akarjuk, hogy a port számát a konfigurációs fájlban. Ahhoz, hogy hozzon létre egy külön konfigurációs osztály, amely tárolja a statikus területén - paraméterei a chat.

A legkényelmesebb módja, hogy tárolja a beállításokat az ingatlan-fájl, javára Java biztosít kényelmes felületet velük dolgozni.

Tehát a mi ingatlan-fájl áll csak egy sort (eddig)

PORT = 1234

Minden terhelési paraméterek statikus inicializáló blokk, mint egy teljes kivitelező esetünkben - a luxus.

Továbbra is csak a helyére Server.java
ServerSocket socketListener = új ServerSocket ( "1234"); a ServerSocket socketListener = új ServerSocket (Config.PORT); és adja hozzá a szükséges import'y

A jövőben import'y kódot fogja veszíteni, mert bármilyen IDE saját helyettesítheti.

Így írt egy új ClientThread ();. De mi ez még nem döntött. Itt az ideje, hogy rögzítse.

Ez az osztály leszünk felelősek a Üzenettovábbítás a kliens és a szerver, ami azt jelenti, hogy a legfontosabb osztály a chat - ez ClientThread.

Mivel fut egy külön téma, az első dolog, amit tennie kell - írja

Most gondolj, hogy mit kell írni a módszer run ().
Tehát, sorrendben. Kezdjük azzal, hogy ki kell törni információt a kliens „Ki vagy te?” Egyébként - „Gyerünk, viszlát!”. Amint megtudtuk, ki ő, mi kell küldeni egy utolsó üzenetet ebben a chat.

Emellett időről időre, meg kell ping'ovat neki néhány kérelem, hogy megbizonyosodjon arról, hogy nem tartja a kapcsolatot egy hulla.

Ezután meg kell kap közvetlen üzenetet, amely értesíti az összes csatlakoztatott ügyfelek.

Nos, amint nem kapott semmilyen kérelmet tőle - a kliensnek el kell távolítani a listáról dostupnh felhasználók.

Abban az időben, elfelejtjük ClientThread, és gondold át, „Hogyan kommunikáció? Kerül sor”
Már úgy döntött, hogy mi lenne átadni a szerializált objektum. Nos, jól lenni ez a tárgy?

Én rendezik a következő:
1. A felhasználó azonosító, elküldte az üzenetet (vagy Server-Bot)
2. Tény, hogy maga az üzenet
3. A feladó idő
4. A rendelkezésre álló szerver a kliens (a kijelzőn a felhasználó)

A sikeres sorszámozás / deserialization osztályban a kliens és a szerver azonosnak kell lennie. Ezért vigyázni, és rögtön, hogy a másik.

Azt hiszem, minden nyilvánvaló. Továbbá, amellett, hogy az üzeneteket szeretnénk közvetíteni valamit, mint ping'ov.

Lehet, hogy valaki jól jön ügyfél :)
Írtam egy pár órát, és tapasztalattal rendelkeznek az áramlás ott, így nem ponty.

Összesen projekt fájl 4:

privát static String username = «»;
statikus foglalat socket = null;

public static void main (String [] args) System.out.println ( «Üdvözöljük a chat kliens \ n!»);
System.out.println ( «Adja meg felhasználónevét és kattintson a \» Enter \ »»);

// Létrehozunk egy patak olvasására a billentyűzetről
BufferedReader billentyűzet = új BufferedReader (új InputStreamReader (System.in));
próbálja // várjuk, amíg a felhasználó belép egy felhasználónevet, és megnyomja az Enter billentyűt
userName = keyboard.readLine ();
System.out.println ();
> Fogás (IOException e)

// A bemeneti és kimeneti csatlakozó patakok már képesek fogadni és küldeni az adatokat a kliens
InputStream InputStream = socket.getInputStream ();
OutputStream outputStream = socket.getOutputStream ();

// konvertálása az áramlás a másik típus, hogy könnyebb kezelni a szöveges üzeneteket
ObjectOutputStream objectOutputStream = új ObjectOutputStream (outputStream);
ObjectInputStream objectInputStream = új ObjectInputStream (InputStream);

új PingThread (objectOutputStream, objectInputStream);

// Létrehozunk egy patak olvasására a billentyűzetről
String message = null;
System.out.println ( «Írja be az üzenetet, majd nyomja meg az \» Enter \ »\ n»);

while (true) message = keyboard.readLine (); // várja meg, amíg a felhasználó belép valami, és megnyomja az Enter billentyűt.
objectOutputStream.writeObject (új üzenet (felhasználónév, üzenet)); // elküldi a beírt szöveget a szerverre.
>
> Fogás (Kivétel e)
>
Végül próbálja meg, ha (socket! = null)
> Fogás (IOException e)
>
>
>

public class ServerListenerThread megvalósítja futtatható privát menet menet = null;
privát ObjectOutputStream objectOutputStream = null;
privát ObjectInputStream objectInputStream = null;

nyilvános ServerListenerThread (ObjectOutputStream objectOutputStream, ObjectInputStream objectInputStream) this.objectOutputStream = objectOutputStream;
this.objectInputStream = objectInputStream;

thread = Új szál (e);
thread.start ();
>

@Override
public void run () próbálja while (true) Üzenet messageIn = (Message) objectInputStream.readObject ();
ha (messageIn instanceof Ping) Ping ping = (Ping) messageIn;
objectOutputStream.writeObject (új Ping ());
> Else System.out.println ( «[» + messageIn.getDate () toString () + ».]» + MessageIn.getLogin () + »» + messageIn.getMessage ().);
>
>
>
catch (SocketException e)
catch (ClassNotFoundException e)
catch (IOException e)
>
>

3, 4) Ez a fájl átviteli protokoll szerver: Message.java és Ping.java

Tulajdonképpen ez az egész kliens. És akkor már maguk a Boost funkciót, és kitalálni GUInyu mit akar)