Permalänk
Medlem

Simpelt Java TCP problem

Hejsan, jag har en enkel flertrådad chatklient som ansluter till en simpel multiuser server.
Jag är dock inte säker på det bästa sättet att hantera listen trådarna, jag använder just nu en

PrintWriter out = new PrintWriter(skt.getOutputStream(), true); som output, och en

BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream())); som input

(Jag vet inte om detta är det bästa sättet att hantera input/output över TCP, då jag inte programmerat i Java särskilt länge.

Problemet ligger i hur input måste läsas, alla exempel jag hittat använder sig av kod i stil med:

while (!in.ready()) { }

för att se till att input alltid finns där ( detta äter dock CPU) och fungerar inte ordentligt heller.
jag har gjort mer avancerade TCP klienter av olika slag i VB och C#, men där väntar streamReaders "automatiskt" tills det finns input, och skapar då inte detta problem.

I mitt fall har jag en tråd i min main klass som körs från det att klienten har anslutit till server tills dess att programmet stängs av, denna tråd kallar en funktion i min TCP klass som ska returnera data som finns att läsa ( String s = TCP.readStream();).

I slutändan ger detta mig väldigt konstig output, while (!in.ready()) { } ser visserligen till att det finns en sträng att läsa (tror jag) , men, det returneras aldrig något till tråden i main klassen, inte heller i debug kod som ligger direkt i funktionen, jag har lyckats få detta att funka på en enkel klient som skickar ett meddelande till en echo server.

Om koden här är otillräcklig är det bara att be om fler exempel.
Tack i förväg /Eaan

Permalänk
Medlem

Read-metoderna i InputStream och dess subklasser blockerar tills det finns data tillgänglig, så det finns ingen anledning att ligga och vänta på ready().

Kan inte säga att jag förstår strukturen på din kod eller ditt problem med "konstig output",
så lite mer kod vore på sin plats, samt en bättre beskrivning av vad som blir fel.

Permalänk
Medlem

Jaha, ser man på... Jag bara antog att det var så man behövde göra då exemplen jag hittade såg ut på det viset, jag testar och ser om det funkar, postar mer kod annars, tack

Permalänk
Medlem

Jag fick det att funka, tack iaf