27. august 2009 - 16:57
Der er
15 kommentarer og 1 løsning
Java sockets - modtag alt data
Hej eksperten. Ved hjælp af nogle forskellige tutorials rundt omkring på nettet, samt arnes multi thread server guide, har jeg lavet en fin lille server. Problemet ligger i, at serveren kun vil modtage linjer af data. Det vil sige, at hvis en kommando er tilsendt serveren uden en klienten har lavet en ny linje ved slutningen, kan serveren ikke modtage den. Da jeg var helt ny til alt hvad der har med sockets at gøre, lavede jeg en VB6 server - denne server kunne modtage alt data, med en delimiter/linje eller ej. Så mit spørgsmål lyder; kan jeg modtage data uden en linje til sidst, med java? tetrix_
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
27. august 2009 - 17:08
#1
Med andre ord: Er der en funktion der ligner .readLine(), der bare læser dataen og ikke linjen? Og jo selvfølgelig kan klienten bare printe en linje, men se bort fra den løsning.
27. august 2009 - 18:16
#2
Der er read metoder som ikke forventer en CRLF til at markere slutningen af linien.
27. august 2009 - 19:34
#3
Hvilke?
27. august 2009 - 19:44
#4
27. august 2009 - 19:54
#5
Problemet her ligger bare i, at readLine er den eneste af disse funktioner der ser ud til at outputte string. Så hvad skal jeg gøre? tetrix_
27. august 2009 - 20:19
#6
Du skal starte med at definere hvad du vil. readLine laeser alle chars indtil CRLF. read laeser en char. Du kan nemt kode noget der laeser 7 chars. Du kan nemt kode noget der laeser en laengde N og saa laeser N chards. Men du kan ikke laese en String uden at der er noget som angiver hvornaar den string slutter. Du laeser 'A'. Er det en streng "A" eller kommer der et 'B' saa det er "AB" ?
28. august 2009 - 21:59
#7
Har gjort et forsøg mht. hvad du foreslog, men resultatet var ikke spor imponerende. Kan du hjælpe mig på vej? Tak - tetrix_
29. august 2009 - 04:31
#8
Et par eksempler:.
29. august 2009 - 04:31
#9
package august; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; public class Protocol1 { public static void main(String[] args) { (new S1()).start(); (new C1()).start(); } } class S1 extends Thread { public void run() { try { ServerSocket ss = new ServerSocket(1234); Socket s = ss.accept(); InputStream is = s.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line; while((line = br.readLine()) != null) { System.out.println(line); } br.close(); is.close(); s.close(); ss.close(); } catch (IOException e) { e.printStackTrace(); } } } class C1 extends Thread { public void run() { try { Socket s = new Socket("localhost", 1234); OutputStream os = s.getOutputStream(); PrintWriter pw = new PrintWriter(os); pw.println("ABC"); pw.println("DEF"); pw.println("GHI"); pw.close(); os.close(); s.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
29. august 2009 - 04:31
#10
package august; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; public class Protocol2 { public static void main(String[] args) { (new S2()).start(); (new C2()).start(); } } class S2 extends Thread { public void run() { try { ServerSocket ss = new ServerSocket(1234); Socket s = ss.accept(); InputStream is = s.getInputStream(); InputStreamReader isr = new InputStreamReader(is); char[] c = new char[3]; while(isr.read(c) > 0) { String val = new String(c); System.out.println(val); } isr.close(); is.close(); s.close(); ss.close(); } catch (IOException e) { e.printStackTrace(); } } } class C2 extends Thread { public void run() { try { Socket s = new Socket("localhost", 1234); OutputStream os = s.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os); osw.write("ABC"); osw.write("DEF"); osw.write("GHI"); osw.close(); os.close(); s.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
29. august 2009 - 04:32
#11
Det første bruger CRLF adskillelse. Det andet antager at længden af strengene er 3.
30. august 2009 - 15:48
#12
Hvis jeg angiver en længde af 10 chars og den kun modtager 9, vil der så opstå en fejl, eller vil der ikke blive modtaget nogen streng eller vil jeg bare modtage strengen?
01. september 2009 - 03:37
#13
Så vil den læse den første char af næste streng som sidste char i denne streng. O.s.v..
01. september 2009 - 03:37
#14
Hvis du vil sende længde så skal du kigge på DataInputStream og DataOutputStream.
01. september 2009 - 14:37
#15
Skal ikke bruge det her til noget alligevel. Smid et svar for din deltagelse ;)
01. september 2009 - 14:58
#16
OK (det er ellers generelt nogle nyttige problem stillinger at have styr paa - og grundliggende er det samme situation uanset valg af sprog)
Kurser inden for grundlæggende programmering