Avatar billede tetrix Nybegynder
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_
Avatar billede tetrix Nybegynder
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.
Avatar billede arne_v Ekspert
27. august 2009 - 18:16 #2
Der er read metoder som ikke forventer en CRLF til at markere slutningen af linien.
Avatar billede tetrix Nybegynder
27. august 2009 - 19:34 #3
Hvilke?
Avatar billede arne_v Ekspert
27. august 2009 - 19:44 #4
Avatar billede tetrix Nybegynder
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_
Avatar billede arne_v Ekspert
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" ?
Avatar billede tetrix Nybegynder
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_
Avatar billede arne_v Ekspert
29. august 2009 - 04:31 #8
Et par eksempler:.
Avatar billede arne_v Ekspert
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();
        }
       
    }
}
Avatar billede arne_v Ekspert
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();
        }
       
    }
}
Avatar billede arne_v Ekspert
29. august 2009 - 04:32 #11
Det første bruger CRLF adskillelse.

Det andet antager at længden af strengene er 3.
Avatar billede tetrix Nybegynder
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?
Avatar billede arne_v Ekspert
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..
Avatar billede arne_v Ekspert
01. september 2009 - 03:37 #14
Hvis du vil sende længde så skal du kigge på DataInputStream og DataOutputStream.
Avatar billede tetrix Nybegynder
01. september 2009 - 14:37 #15
Skal ikke bruge det her til noget alligevel.

Smid et svar for din deltagelse ;)
Avatar billede arne_v Ekspert
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)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester