07. april 2013 - 16:43Der er
35 kommentarer og 1 løsning
timeout på readline hvis der ikke kommer noget input
prøver at finde ud af hvordan jeg kan sætte en timeout på min readline. Grunden til jeg vil det, er at jeg gerne vil have programmet til at gå videre hvis readline ikke får nogen værdi fra client. en slags timeout.. eller anden løsning hvis det er bedre. Har følgende kode hvor jeg gerne vil have den til at tjekke readline om den har en værdi og derefter gå videre:
int i = 0; while (i < clientBuffReader.size()) { BufferedReader inFromClient = (BufferedReader) clientBuffReader.get(i);
oText = inFromClient.readLine();
if (!oText.equals(null)) {
int a = 0; while (a < clientPrintWriter.size()) { Socket writeToServerSocket = (Socket) clientSockets.get(a); PrintWriter writeToClient = (PrintWriter) clientPrintWriter.get(a); writeToClient.println(oText); a++; } messageField.append(oText);
ved ikke hvordan jeg skal løse problemet.. men det der er galt er at når man fx. har 2 clients og skriver fra dem, så skal de skiftes til at få vist deres besked i textarea.. og tror det skyldes at readline blokerer på en eller anden måde.
Hvad ville du så foreslå at jeg bruger ? Har dog fået det til vat køre nu, ved bare ikke om det er optimalt.
Har et andet spørgsmål som jeg tænkte jeg ligeså godt kunne stille her. Prøver at sende nogle Arraylists fra server til client, som bl.a. indeholder buffered reader, men kan ikke få det til at virke. Har prøvet at bruge ObjectOutputStream, men tror ikke jeg gør det korrekt.
java.io.StreamCorruptedException: invalid stream header: 78785365 at java.io.ObjectInputStream.readStreamHeader(Unknown Source) at java.io.ObjectInputStream.<init>(Unknown Source) at chatClient.ChatClientHandler$GetMessages.run(ChatClientHandler.java:88)
linje 88 er: ois = new ObjectInputStream(clientSocket.getInputStream());
og en masse underlige udskrifter i mit textarea i min gui, bl.a. en masse tegn der ikke kan vises .
okay det har jeg så også ændret nu. Sender bare en ArrayList<String> nu. Har et sidste spørgsmål. Hvis jeg fra min server side, sender noget til client, kan det være forskellige slags data. I stedet for at jeg igennem en enkelt tråd på client siden, skal afgøre hvilken slags data det er, kan jeg så vælge hvilken tråd (hos client) der skal tage sig af det output fra server? Det er fordi min Buffered Reader hos client prøver at tage imod input, lige meget om det er ren tekst eller en ArrayList der bliver sendt. Ved ikke om jeg har forklaret mig ordenligt, men håber du forstår hvad jeg mener.
valgte at løse mit problem på en anden måde. Har valgt at benytte mig af ObjectInputStream (og Output), men har et lille problem med det.. Vil gerne tjekke om der er noget at læse for readObject() og hvis der ikke er, gå videre i programmet.. ellers hænger den bare der og venter indtil der er input fra client.
Kan man tjekke det på en eller anden måde og så gå videre?
Okay, jeg må nok hellere droppe den løsning så. Det lyder som om ObjectStream er lidt overkill. Synes ellers det virkede som en fornuftig måde at gøre det på. Men hvis jeg ikke kan tjekke om der er noget at læse ved readObject() kan mit program ikke køre som det skal, så ender det med at klienterne skal skiftes om at skrive en besked til server
ja det har du ret i. Har skifter min objectstream ud. hmm hvordan ville du tjekke en readLine (buffered reader) om der er noget at læse (eller tjekke buffered reader... men uden at læse readline. Vil bare gerne tjekke om der er noget input
har skrevet sådan her hvor der kigges efter nye beskeder og derefter skriver den til samtlige clients. Men sådan som det er nu, skal clients skiftes til at få sendt deres besked fordi readline venter på den næste input. Kan man ikke bare få den til at gå videre hvis der ikke er noget input? Eller gøre noget andet smart?
// ALMINDELIG TEKST BESKED if (checkMesType.getMesType(inputMes = inFromClient.readLine()) == 1 && inputMes != null) { messageField.append(checkMesType.getMes(inputMes));
// Besked skrives til alle clients int p = 0; while (p < clientPWArray.size()) { outToClient = clientPWArray.get(p); outToClient.println("1." + checkMesType.getMes(inputMes)); p++; }
outToClient = new PrintWriter(connectionSocket.getOutputStream(), true); inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
// ALMINDELIG TEKST BESKED if (checkMesType.getMesType(inputMes = inFromClient.readLine()) == 1 && inputMes != null) { messageField.append(checkMesType.getMes(inputMes));
// Besked skrives til alle clients int p = 0; while (p < clientPWArray.size()) { outToClient = clientPWArray.get(p); outToClient.println("1." + checkMesType.getMes(inputMes)); p++; }
kan man ikke tjekke om der kommer noget igennem den readline man kalder og hvis der ikke gør så gå videre med programmet i stedet for at den bare står og venter på input?
men den stopper bare ved readline uanset om klienten har skrevet noget igennem den. hvordan får man den til at gå videre uden at skulle vente på input fra den bestemte klient i mit loop?
Hey tak for det. Det ser godt ud! Har også fået mit peogram til at køre som det skulle :) avde forresten gået og tænkt over noget omkring servere. Hvis man har en server, eksempelvis en char server, så skal den jo køre hele tiden for at klienterne kan bruge det. Er der en måde at få serveren til at køre uden selv at skulle have en server computer stående og køre derhjemme. Er der nogen form for servixe der tilbyder dette eller kan man gøre noget andet smart for at få det til at køre konstant ? Stiller mest mit spørgsmål af nysgerrighed, ikke noget jeg står og skal bruge lige nu.
Du kan leje en VPS og koere en server daemon paa den.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.