Srodne teme
Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Java(TCP) chat aplikacija

[es] :: Java :: Java(TCP) chat aplikacija

[ Pregleda: 5199 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

djolem89
Student
Beograd

Član broj: 277713
Poruke: 3
*.adsl-a-1.sezampro.yu.



Profil

icon Java(TCP) chat aplikacija21.01.2011. u 13:31 - pre 160 meseci
Pocetnik sam sa programiranjem u javi, i potrebna mi je mala pomoc oko sledeceg:

zelim da napravim jednostavnu chat aplikaciju koja ce samo slati poruku izmedju klijenta i servera (dakle 2 racunara, jedan od njih je server drugi je klijent, komunikacija izmedju njih).

imam par ideja kako to da ostvarim (preko TCP protokola, Buffered Reader tok podataka), ali uvek mi zafali neki element, pa bih vas zamolio da me uputite na neki dobar tutorial za to.

 
Odgovor na temu

nnn
Tech Lead
Haxr.io
Beograd

Član broj: 16743
Poruke: 679
*.dynamic.isp.telekom.rs.



+87 Profil

icon Re: Java(TCP) chat aplikacija21.01.2011. u 13:53 - pre 160 meseci
Imas srece, bas sad radim na client server chatu, ali za Android. Nema veze, evo ti server, u svojim korenima.

Server.java
Code:

package com.chat;

import java.io.*;
import java.net.*;
import java.util.*;

public class Server
{
        
// The ServerSocket we'll use for accepting new connections
private ServerSocket ss;

        //server port
        private static int _port = 7475;
        // A mapping from sockets to DataOutputStreams. This will
        // help us avoid having to create a DataOutputStream each time
        // we want to write to a stream.
        private Hashtable<Socket, DataOutputStream> outputStreams = new Hashtable<Socket, DataOutputStream>();
        
        // Constructor and while-accept loop all in one.
        public Server( int port ) throws IOException {
            // All we have to do is listen
            listOfClients= new Vector<ServerThread>();
            listen( port );
            
        }
        
        //all clients in a vector
        private Vector<ServerThread> listOfClients;

/*Checks if nickname is avaliable*/
public boolean checkNick(String nick)
{
    if(nick.contains("#"))
        return false;
    for (Enumeration<ServerThread> e = listOfClients.elements(); e.hasMoreElements(); ) {
    
        if ( nick.equals( e.nextElement().getNick() )) {
            return false;
        }
        
    }
    
    return true;
}

public void removeClient(ServerThread temp){listOfClients.remove(temp);}

private void listen( int port ) throws IOException {
        // Create the ServerSocket
        ss = new ServerSocket( port );
            // Tell the world we're ready to go
            System.out.println( "Listening on "+ss );
            
            // Keep accepting connections forever
            while (true) {
                // Grab the next incoming connection
                Socket s = ss.accept();
                // Tell the world we've got it
                System.out.println( "Connection from "+s );
                // Create a DataOutputStream for writing data to the client
                DataOutputStream dout = new DataOutputStream( s.getOutputStream() );
                
                // Save this stream so we don't need to make it again
                outputStreams.put( s, dout );
                
                // Create a new thread for this connection, and then forget
                // about it
                ServerThread current = new ServerThread( this, s );
                current.setDout(dout);
                listOfClients.add(current);
                
                current.start();
            }
}

// Get an enumeration of all the OutputStreams, one for each client
// connected to us
Enumeration<DataOutputStream> getOutputStreams() {
    return outputStreams.elements();
    }


// Send a message to all clients (utility routine)
void sendToAll( String message ) {
    
// We synchronize on this because another thread might be
// calling removeConnection() and this would screw us up
// as we tried to walk through the list
synchronized( outputStreams ) {
// For each client ...
for (Enumeration<DataOutputStream> e = getOutputStreams(); e.hasMoreElements(); ) {
    // ... get the output stream ...
    DataOutputStream dout = (DataOutputStream)e.nextElement();
    // ... and send the message
    try {
    dout.writeUTF( message );
    } catch( IOException ie ) { System.out.println( ie ); }

    }
    }
}

    // Remove a socket, and it's corresponding output stream, from our
    // list. This is usually called by a connection thread that has
    // discovered that the connecting to the client is dead.
void removeConnection( Socket s ) {
    // Synchronize so we don't mess up sendToAll() while it walks
    // down the list of all output streams
    synchronized( outputStreams ) {
    // Tell the world
    System.out.println( "Removing connection to "+s );
    // Remove it from our hashtable/list
    outputStreams.remove( s );
    // Make sure it's closed
    try {
    s.close();
    } catch( IOException ie ) {
    System.out.println( "Error closing "+s );
    ie.printStackTrace();
    }
    }
    
}
    // Main routine
    static public void main( String args[] ) throws Exception {
    
    // Create a Server object, which will automatically begin
    // accepting connections.
    new Server( _port );
    }
}



ServerThread.java
Code:

package com.chat;

import java.io.*;
import java.net.*;

public class ServerThread extends Thread {
    
    //The Server that spawned us
    private Server server;
    
    //Client socket
    private Socket socket;
    
    //Client info
    private String nick;
    
    private DataOutputStream dout;
    
    public ServerThread(Server _server, Socket _socket) {
        this.server = _server;
        this.socket = _socket;
    }
    
    public String getNick(){ return nick; }
    
    public void setDout(DataOutputStream _dout){dout=_dout;}
    
public void run()
{
    try {
        // Create a DataInputStream for communication; the client
        // is using a DataOutputStream to write to us
        DataInputStream din = new DataInputStream( socket.getInputStream() );
        
        
        String _nick = din.readUTF();
        System.out.println(socket.toString()+ " : Received nickname: "+ _nick);
            
        //Until we get a valid nick
        while( ! server.checkNick(_nick) )
            {
            System.out.println(socket.toString()+ " : Nickname in use");
            dout.writeUTF("#inuse");
            
            //Wait for reply with new nick
            _nick = din.readUTF();
            }
        nick = _nick;
        //report to client that nick is ok
        dout.writeUTF("#ok");
        
        
        // Over and over, read message and send it to all clients
        while (true) {
        // ... read the next message ...
        String message = din.readUTF();
        // ... tell the world ...
        System.out.println( "Sending "+message );
        // ... and have the server send it to all clients
        server.sendToAll("#"+nick+"##"+ message );
            }
        } catch( EOFException ie ) {
        // This doesn't need an error message
        } catch( IOException ie ) {
        // This does; tell the world!
        ie.printStackTrace();
        } finally {
        server.removeClient(this);
        server.removeConnection( socket );
        }
    }
}




Sto se tice clienta, dacu ti samo ti neke elemente iz moje Android aplikacije koji ti mozda tebaju. U supstinim moras da imas jednu nit u pozadini koja ce da radi ovako nesto
Code:

mySock = new Socket(Main.hostAddress, Main.port);
            OutputStream sou = mySock.getOutputStream();
            dos = new DataOutputStream(sou);

            dis = new DataInputStream( mySock.getInputStream() );


try {        
            while (work)
            {
                LastMessage=dis.readUTF(); 
                handler.sendEmptyMessage(1);// Ovo ti je u Androidu signalizilas handler klasi koji reaguje na event( poruku) i osvezava UI.
            }

        } catch (UnknownHostException e) {
        } catch (IOException e) {
        } 

    }

Sad, ja iz moje User interface niti, citam poruke i saljem ih sa dos.WriteUTF(Message);

Ti vidi kako ces to da resis, da li ces u konzoli ili ipak neki swing interface..


Inace server i nije nesto efikasan posto za svakog clienta pravi po jednu nit, ako aplikacija naraste onda cu da predjem na selektore, ovako je za sada samo neki test. Server ima funkciju za proveravanje nicka, on ocekuje da je prva poruka koju client posalje u stvari nickname. To sve mozes da obrises.

Nadam se da ce ti ovo pomoci.


 
Odgovor na temu

TasmanF1

Član broj: 277620
Poruke: 44



Profil

icon Re: Java(TCP) chat aplikacija22.01.2011. u 13:45 - pre 160 meseci
Ako si početnik onda bi ti ovo moglo biti od pomoći
Klijent šalje serveru rečenicu (niz karaktera) koja se na serverskoj strani pretvara u velika slova i nakon toga server tu rečenicu vraća klijentu
Ovo je krajnje prosto ali hteo sam samo da pokažem logiku komunikacije klijenta i servera (TCP veza)

TCPKlijent.java:
Code:

package tcpklijentserver;
import java.io.*;//sadrži klase za ulazne i izlazne tokove
import java.net.*;//sadrži klase za rad sa mrežom

public class TCPKlijent {
    public static void main(String argv[]) throws Exception
    {
        String recenica;        //niz karaktera koje korisnik upisuje i šalje ka serveru
        String recenica2;      //niz karaktera koji se dobija od servera

        //"odKorisnika" je ulazni tok za program koji je povezan sa tastaturom (System.in)
        BufferedReader odKorisnika = new BufferedReader(new InputStreamReader(System.in));

        Socket klijentSoket = new Socket("hostname", 1234); //soket,"hostname" je naziv servera, "1234" je port

        //"izlazKaServeru" je izlazni tok koji je povezan sa soketom, karakteri koje klijent šalje u mrežu ulaze u ovaj tok
        DataOutputStream izlazKaServeru = new DataOutputStream(klijentSoket.getOutputStream());
        
        //"odServera" je drugi ulazni tok koje je povazan sa soketom, karakteri koji stižu iz mreže ulaze u ovaj tok
        BufferedReader odServera = new BufferedReader(new InputStreamReader(klijentSoket.getInputStream()));
        
        recenica = odKorisnika.readLine();//smeštanje tekst koji korisnik unosi
        
        //"'\n'" predstavlja povratak na početak reda, prolazi kroz klijentov soket i ulazi u TCP
        izlazKaServeru.writeBytes(recenica + '\n');
        
        //kada karakteri stižu sa servera, prolaze kroz tok "odServera" i smeštaju se u "recenica2"
        recenica2 = odServera.readLine();
        
        //Na monitoru se ispisuje modifikovana rečenica
        System.out.println("Od servera: "+ recenica2);
        
        //zatvara se soket odnosno TCP veza između klijenta i servera
        klijentSoket.close();
    }

}



TCPServer.java:
Code:

package tcpklijentserver;
import java.io.*;
import java.net.*;

public class TCPServer {
    public static void main(String argv[]) throws Exception
    {
        String recenicaKlijent;
        String recenicaVelikaS;

        //"serverSoket" osluškuje zahteve klijenta
        ServerSocket serverSoket = new ServerSocket(1234);

        while(true)
        {
            /*pravi se novi soket pod nazivom "osluskivanje" u slučaju kada se klijent obrati soketu "serverSoket"
             nakon toga se uspostavlja veza između "klijentSoket" na klijentskoj strani i "osluskivanje" na serverskoj strani*/
            Socket osluskivanje = serverSoket.accept();

            //"odKlijetna" i "kaKlijentu" su dva toka koja su slična tokovima na klijentskoj strani...
            BufferedReader odKlijenta = new BufferedReader(new InputStreamReader(osluskivanje.getInputStream()));
            DataOutputStream kaKlijentu = new DataOutputStream(osluskivanje.getOutputStream());
            recenicaKlijent = odKlijenta.readLine();

            //uzima se red teksta koji je poslao klijent, pretvara se u velika slova i dodaje znak za povratak na početak reda
            recenicaVelikaS = recenicaKlijent.toUpperCase() + '\n';
            
            kaKlijentu.writeBytes(recenicaVelikaS);
        }
    }

}


 
Odgovor na temu

djolem89
Student
Beograd

Član broj: 277713
Poruke: 3
*.adsl-a-1.sezampro.yu.



Profil

icon Re: Java(TCP) chat aplikacija25.01.2011. u 10:13 - pre 160 meseci
TasmanF1, ovako neku ideju imam i ja.

umesto hostname bi isla IP adresa racunara, jel tako ?

razmisljao sam i da napravim neku swing formu, tako da postoji jedan text field u koji bi se upisivao tekst, i iznad text area gde bi bio history chata. medjutim, pre toga bih voleo da isprobam da li ovo radi, to moze da se izvede preko konzole ?
 
Odgovor na temu

ManInTheBox
Beograd

Član broj: 272293
Poruke: 26
*.dynamic.sbb.rs.



Profil

icon Re: Java(TCP) chat aplikacija27.01.2011. u 22:32 - pre 160 meseci
Citat:
umesto hostname bi isla IP adresa racunara, jel tako ?

Ili IP adresa, ili bas ime hosta... kako zelis
Socket(String host, int port)

Btw, ako testiras aplikaciju na lokalnom racunaru, mozes ili 127.0.0.1 ili localhost ili jednostavno null kako je navedeno u API-ju.

Naravno da mozes preko konzole da testiras ovu aplikaciju, inace ona i jeste konzolna.
Code (java):

        //"odKorisnika" je ulazni tok za program koji je povezan sa tastaturom (System.in)
        BufferedReader odKorisnika = new BufferedReader(new InputStreamReader(System.in));
 


Prvo podesi PATH sistemsku promenljivu da gleda za izvrsnim datotekama u JDK-u:

U terminalu otkucas:

C:\path %PATH%;C:\Program Files\Java\jdk1.6.0_18\bin
Obrati samo paznju na TVOJU putanju do JDK.

Sledece prevedi izvorni kod:
C:\ javac TCPServer.java
C:\javac TCPKlijent.java

Otvori jos jedan Command Prompt.

U jednom pokreni server
C:\java TCPServer

U drugom klijent
C:\java TCPKlijent

... i to je to

Sto se tice PATH, mozes i ovako (Windows XP)
Desni klik na My Computer->Properties->Advanced->Environment Variables->System variables->Path->Edit->Dopises ;Tvoja putanja do JDK

Ili pokreni IDE koji koristis

Pozdrav
 
Odgovor na temu

djolem89
Student
Beograd

Član broj: 277713
Poruke: 3
*.adsl-a-1.sezampro.rs.



Profil

icon Re: Java(TCP) chat aplikacija30.01.2011. u 08:25 - pre 160 meseci
hvala veliko!
 
Odgovor na temu

MMX
Miloš Malović
Platform engineer, Supplyframe
Beograd

SuperModerator
Član broj: 2423
Poruke: 2105
212.178.244.*

Jabber: mmx@elitesecurity.org
ICQ: 98797759
Sajt: www.mmx.rs


+11 Profil

icon Re: Java(TCP) chat aplikacija30.01.2011. u 14:01 - pre 160 meseci
Moja preporuka je da prvo pročitaš tutorial o socketima:

http://download.oracle.com/javase/tutorial/networking/sockets/

Kada budeš razumeo šta su socketi i na koji način funkcionišu, neće biti problem da napraviš bilo koju mrežnu aplikaciju.
↑ ↑ ↓ ↓ ← → ← → B A B A [select] [start]
 
Odgovor na temu

Jordan90
student

Član broj: 294595
Poruke: 52
*.dynamic.sbb.rs.



Profil

icon Re: Java(TCP) chat aplikacija07.12.2011. u 21:34 - pre 149 meseci
Znam da je malo zastarela tema,ali da je malo osvezim..
Imam klasu za Server:
import java.io.*;
import java.net.*;

public class ChatServer{

//pravimo 10 mesta za klijente
static KlijentNit klijenti[] = new KlijentNit[10];

public static void main(String args[]) {
//broj porta koji cemo zauzeti
int port = 2222;

//preko argumenata komandne linije moze se uneti alternativni broj porta
if(args.length>0)port = Integer.parseInt(args[0]);

//deklaracija soketa klijenta koji ce doci na server
Socket clientSocket = null;
try {
//zauzimamo port
ServerSocket serverSocket = new ServerSocket(port);
while(true){
//cekamo klijenta
clientSocket = serverSocket.accept();
//proveravamo koje je mesto slobodno
for(int i=0; i<=klijenti.length; i++){
//na slobodnom mestu pravimo nit koja ce raditi sa klijentom i
//pokrecemo je
if(klijenti==null)
{
klijenti = new KlijentNit(clientSocket, klijenti);
klijenti.start();
break;
}
}
}
}
catch (IOException e) {
System.out.println(e);
}
}
}

Klasa za Thread:

import java.io.*;
import java.net.*;

public class KlijentNit extends Thread {

//ulazni i izlazni tok
BufferedReader is = null;
PrintStream os = null;
Socket soket = null;
//niz svih klijenata na serveru
KlijentNit[] klijenti;

public KlijentNit(Socket soket, KlijentNit[] klijent) {
this.soket = soket;
this.klijenti = klijent;
}

public void run() {
String linija;
String ime;
try {
//inicijalizacija ulazno-izlaznih tokova
is = new BufferedReader(new InputStreamReader(soket.getInputStream()));
os = new PrintStream(soket.getOutputStream());
//ucitava se ime klijenta
os.println("Unesite ime.");
ime = is.readLine();

os.println("Dobrodosao/la " + ime + ".\nZa izlaz unesite /quit");
//obavestavaju se svi korisnici o dolasku novog korisnika
for (int i = 0; i <= 9; i++) {
if (klijenti != null && klijenti != this) {
klijenti.os.println("*** Novi korisnik: " + ime + " je usao u chat sobu !!! ***");
}
}

while (true) {
//ucitava se linija teksta od korisnika
linija = is.readLine();
//ako pocinje sa /quit izlazi se iz petlje
if (linija.startsWith("/quit")) {
break;
}
//svim korisnicima se salje poruka
for (int i = 0; i <= 9; i++) {
if (klijenti != null) {
klijenti.os.println("<" + ime + "> " + linija);
}
}
}

//obavestavaju se svi korisnici sem ovog da izlazi iz chat sobe
for (int i = 0; i <= 9; i++) {
if (klijenti != null && klijenti != this) {
klijenti.os.println("*** Korisnik " + ime + " izlazi iz chat sobe !!! ***");
}
}
os.println("*** Dovidjenja " + ime + " ***");

//zatvaramo soket
soket.close();
} catch (IOException ex) {
ex.printStackTrace();
for (int i = 0; i <= 9; i++) {
if (klijenti == this) {
klijenti = null;
}
}

}
}
}
I klasa za Klijente :
import java.io.*;
import java.net.*;

//klasa ChatKlijent implementira "Runnable", kako bi mogla da se pokrene kao nit
public class ChatKlient implements Runnable {


// Deklaracija promenljivih
static Socket clientSocket = null;
//ulaz-izlaz za soket
static PrintStream os = null;
static BufferedReader is = null;
//ulaz sa konzole
static BufferedReader ulazKonzola = null;
//da li je korisnik izasao iz chat sobe
static boolean kraj = false;

public static void main(String[] args) {
try {
//broj porta chat servera
int port = 2222;
//preko argumenata komandne linije moze se uneti alternativni broj porta
if(args.length>0)port = Integer.parseInt(args[0]);

//povezujemo se na host
clientSocket = new Socket("localhost", port);

//inicijalizacija ulaza sa konzole
ulazKonzola = new BufferedReader(new InputStreamReader(System.in));

//inicijalizacija ulazno-izlaznih tokova
os = new PrintStream(clientSocket.getOutputStream());
is = new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));

//pravi se nit koja ce da cita poruke
new Thread(new ChatKlient()).start();



//dokle god nije kraj
//pise serveru ono sto ucita sa konzole, liniju po liniju
while (!kraj) {
os.println(ulazKonzola.readLine());
}
//zatvaramo soket
clientSocket.close();
} catch (UnknownHostException e) {
System.err.println("Don't know about host ");
}catch (IOException e) {
System.err.println("IOException: " + e);
}
}

public void run() {
String linijaOdServera;
try {
//ucitavamo liniju od servera
while ((linijaOdServera = is.readLine()) != null) {
System.out.println(linijaOdServera);
//ako stigne *** Dovidjenja, obelezavamo da je kraj
//i prekidamo izvrsavanje niti
if (linijaOdServera.indexOf("*** Dovidjenja") == 0) {
kraj = true;
return;
}
}
} catch (IOException e) {
System.err.println("IOException: " + e);
}
}
}

Ono sto me zanima jeste,kako da napravim neku .txt bazu u kojoj ce da se cuvaju svi klijenti,kao i njihove poruke?
Zatim da za svakog klijenta postoji username i password?
I na kraju kod za privatne poruke koje ce pojedini klijent da salje nekom klijentu,i koje nece biti vidljive drugim korisnicima(kao neki Inbox)?
Zahvalan sam na bilo kakvoj pomoci..
 
Odgovor na temu

[es] :: Java :: Java(TCP) chat aplikacija

[ Pregleda: 5199 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.