webForumDet fria alternativet

Hjälp med Chatt?!?!

6 svar · 343 visningar · startad av Pipen

PipenMedlem sedan juni 200214 inlägg
#1

Hejsan..
Jag håller på med en chatt i Java..

Har dock stött på 2 problem..

1: När alla klienter är uppkopplade mot servern så skickas medelandena till servern och sedan tillbaka till klienten som skickade medelandet.. inte till dom andra klienterna..

2: Man kan inte skriva ett medelande om man itne motagit något verkar det som.. KODEN:

            while ((fromServer = myInput.readLine()) != null) {
                System.out.println(fromServer);
                
                fromClient = stdIn.readLine();
    	    if (fromClient != null) {
                       myOutput.println("MSG!\<" + userName + "\> " + FromClient);
          	    }
            }
jmeMedlem sedan maj 20011 967 inlägg
#2

Beror på hur du har implementerat servern.

Din server lyssnar ju på nya klienter. Skapa en klass som hanterar varje klient. Varje gång en ny klient kopplar upp sig till chatten så instansieras en ny klienthanterare som sköter försändelse till och från servern.

Varje klienthanterare har en referens till server-objektet.
varje klienthanterare har en referens till en Socket objekt.
Varje klienthanterare har metoden sendMessage().

Lagra denna klienthanterare i en Vector i server-klassen.

Ha en sendAll() metod i servern som skickar meddelandet till alla andra klienter.

Denna metod fungerar således att du loopar vector:n och plockar fram varje element från den, dvs en klienthanterare åt gången.

server.sendAll(KlientHanterare ignoreMe, String meddelande):

ignoreMe är den klienthanterare som skickade detta meddelande.

hämta varje element ur vectorn i en for-loop

KlientHanterare h = (KlientHanterare)vector.get(i);

Kontrollera att h inte är samma som ignoreMe. Detta för att du inte vill skicka meddelandet till dig själv.

if(!ignoreMe.equals(h) )
{
h.sendMessage(message);
}

sendMessage(String message):

OutputStream out = socket.getOutputStream();

out.write(message.getBytes() );

Ifall du har tänkt att alla klienter samt servern är uippbyggda med Java så kan du köra med ObjecktOutputStream samt ObjectInputStream för då kan du skriva och läsa egenskapade klasser. Du kan då t ex ha en Message klass som innehåller mottagaren, sändaren samt meddelandet. Sen får du själv implementera ett sätt hur du behandlar message objektet.

hmm, du har en while loop där du väntar på data från servern.

while ((fromServer = myInput.readLine()) != null)
{
din kod

}

Så länge fromServer är null så kommer du inte in i loopen. Du kommer bara åt myOuput då du är inuti loopen. Därför kan du bara skriva svara då nån har skrivit.

Dela upp programmet i två trådar, en som lyssnar på input och en som lyssnar på tangentbordet.

Skapa en klass som antingen ärver från Thread eller implementerar interfacet Runnable.

Kolla på klassen Thread samt interfacet Runnable i API doc:

http://java.sun.com/j2se/1.4.2/docs/api/

mer info hittar du även här:

http://java.sun.com/docs/books/tutorial/essential/threads/

Jag har tidigare gjort en Java-chat som du kan titta på, bara jag hittar den. :) Klienten är applet-baserad varvid servern är en vanlig Java-applikation.

Den har stöd för multipla användare, smilies och timestamps.

Säg till om du är intresserad av att se på den.

Om du vill så kan vi diskutera mer Messenger. Heter jme på Messenger.

LimeMedlem sedan sep. 2001837 inlägg
#3

Trådar... Du måste använda trådar...

På serversidan ligger du och lyssnar på en ServerSocket. När du får något på den så måste du skicka ut till alla anslutna klienter, som du sparat undan in någon form av Dispatch-klass.

På klientsidan har du en tråd som ligger och lyssnar efter nya meddelanden och lägger upp dessa i textfönstret.

/Lime

juventus1Medlem sedan dec. 2000401 inlägg
#4

Eller använd MulticastSocket, så slipper du skriva en del kod.

PipenMedlem sedan juni 200214 inlägg
#5

Jag hajajr itne hur jag skall lösa detta med trådar.. :(
behöver verkligen all hjälp jag kan få.. skulel vara jätte tacksam om någon skulel vilja hjälpa mig på ICQ (13007312)/ MSN (erik7697@edu.upplands-bro.se)

PipenMedlem sedan juni 200214 inlägg
#6

nu har jag löst fråga 1..
men jag hajjar fortfarande int ehur jag skall lösa fråga 2.. är helt lost när det gäller Trådar

LimeMedlem sedan sep. 2001837 inlägg
#7

Pipen... det är förmodligen det som är meningen med hela övningen... att du ska lära dig om trådar.

Genererad på 392 ms · cache AV · v20260730165559-full.f96bc7eb