/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Min klient blokere
Fra : bob


Dato : 18-09-06 10:28

Jeg har denne simple Server/klient applikation hvor serverne først
startes, dernæst forbinder klienten og står og venter på input fra
brugeren.

Første gang jeg indtaster noget input så står klienten bare og
blokere og der sker ikke mere.:

import java.io.*;
import java.net.*;


public class Server {

   public static void main(String[] args) {

ServerSocket serverSocket = null;
Socket ss = null;
BufferedReader in = null;
PrintWriter out = null;


      try {
          serverSocket = new ServerSocket(4444);

          System.out.println("CRAP1");
          ss = serverSocket.accept();
          System.out.println("CRAP2");
          in = new BufferedReader(new
InputStreamReader(ss.getInputStream()));
          out = new PrintWriter(ss.getOutputStream());

          String bob = null;

          while ((bob = in.readLine()) != null)
          {
             System.out.println("CRAP3");
             out.println(bob + "from server");
             System.out.println(bob);
          }
          serverSocket.close();
   }

      catch (IOException e) {
         e.printStackTrace();
      }
   }

}





import java.io.*;
import java.net.*;

public class Client {

   public static void main(String[] args) {
      Socket socket = null;
      PrintWriter out = null;
      BufferedReader in = null;
      BufferedReader user = null;
      try
      {
         String fromServer, fromUser;

         // Connect to server.
         socket = new Socket("localhost",4444);

      // Out channel.
         out = new PrintWriter(socket.getOutputStream());

      // In channel.
         in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));

         // Input from user.
      user = new BufferedReader(new InputStreamReader(System.in));

         while ((fromServer = in.readLine()) != null)
         {
            System.out.println(fromServer);
            fromUser = user.readLine();

            if (fromUser != null)
            {
               out.println(fromUser);
            }
         }


      }catch(Exception e)
      {
         System.out.println(e.getMessage());
      }
   }

}


håber der er nogen som har en ide om hvad jeg gør galt


 
 
Andreas Plesner Jaco~ (18-09-2006)
Kommentar
Fra : Andreas Plesner Jaco~


Dato : 18-09-06 11:12

On 2006-09-18, bob <eksamor@yahoo.com> wrote:

> Jeg har denne simple Server/klient applikation hvor serverne først
> startes, dernæst forbinder klienten og står og venter på input fra
> brugeren.

> ss = serverSocket.accept();

Du accepter

> while ((bob = in.readLine()) != null)

Og læser en linje på serversiden.

På klientsiden...

> socket = new Socket("localhost",4444);

Connecter du

> while ((fromServer = in.readLine()) != null)

Og læser en linje.

Så de står begge og venter på at læse fra hinanden
Derudover bør du nok strø nogle flush ud over dit program de fleste
steder, hvor du printer.

--
Andreas

bob (18-09-2006)
Kommentar
Fra : bob


Dato : 18-09-06 11:43

Andreas Plesner Jacobsen skrev:

> On 2006-09-18, bob <eksamor@yahoo.com> wrote:
>
> > Jeg har denne simple Server/klient applikation hvor serverne først
> > startes, dernæst forbinder klienten og står og venter på input fra
> > brugeren.
>
> > ss = serverSocket.accept();
>
> Du accepter
>
> > while ((bob = in.readLine()) != null)
>
> Og læser en linje på serversiden.
>
> På klientsiden...
>
> > socket = new Socket("localhost",4444);
>
> Connecter du
>
> > while ((fromServer = in.readLine()) != null)
>
> Og læser en linje.
>
> Så de står begge og venter på at læse fra hinanden
> Derudover bør du nok strø nogle flush ud over dit program de fleste
> steder, hvor du printer.
>
> --
> Andreas

Nu har jeg udskiftet while i min klient med:

      while ((fromUser = user.readLine()) !=null)
      {
         System.out.println("test");
         out.println(fromUser);

         System.out.println(in.readLine());

      }

Men det løser ikke problemet.

1) Starter min server som blokere indtil en klient forbinder.

2) En klient forbinder og blokere indtil en bruger indtaster
information.

3) Når en klient forbinder forsætter serveren ned til while løkken
hvor den blokere indtil der kommer noget input fra en klient

4) En bruger skriver "bob" hvilket medfører at "test" udskrives og
dernæst sender den via 'out.println(fromUser)' beskeden "bob" til
serveren.

5) Nu skulle den blokerende server meget gerne stoppe med at blokere og
udføre én iteration af while løkken:

          while ((bob = in.readLine()) != null)
          {
             System.out.println("read from in channel");
             out.println(bob + " from server");
             System.out.println(bob);
          }

men det gør den ikke! "read from in channel" bliver aldrig udskrevet.


Andreas Plesner Jaco~ (18-09-2006)
Kommentar
Fra : Andreas Plesner Jaco~


Dato : 18-09-06 11:54

On 2006-09-18, bob <eksamor@yahoo.com> wrote:

>
> Nu har jeg udskiftet while i min klient med:

[...]

> Men det løser ikke problemet.

Du glemte vist:
>> Derudover bør du nok strø nogle flush ud over dit program de fleste
>> steder, hvor du printer.

Mere specifikt: De steder hvor du printer til sockets.

Du ville nok også være hjulpet godt på vej med en pakkesniffer når du nu
skriver netværkskode.

--
Andreas

bob (18-09-2006)
Kommentar
Fra : bob


Dato : 18-09-06 12:57


Andreas Plesner Jacobsen skrev:

> On 2006-09-18, bob <eksamor@yahoo.com> wrote:
>
> >
> > Nu har jeg udskiftet while i min klient med:
>
> [...]
>
> > Men det løser ikke problemet.
>
> Du glemte vist:
> >> Derudover bør du nok strø nogle flush ud over dit program de fleste
> >> steder, hvor du printer.
>
> Mere specifikt: De steder hvor du printer til sockets.
>
> Du ville nok også være hjulpet godt på vej med en pakkesniffer når du nu
> skriver netværkskode.
>
> --
> Andreas

tak skal du ha! Anede ikke man skulle bruge flush.

Jeg har lavet et tilsvarende eksempel hvor jeg bruger DataOutputStream
og DataInputStream. Hvad er årsagen til at de ikke fungere med disse
objeckter? Det fungere fint hvis jeg holder mig til at bruge
PrintWriter og BufferedReader, men med DataIn/Out går det galt:

import java.io.*;
import java.net.*;


public class Server {

   public static void main(String[] args) {

ServerSocket serverSocket = null;
Socket ss = null;
DataInputStream in = null;
DataOutputStream out = null;
//BufferedReader in = null;
//PrintWriter out = null;

      try
      {
         serverSocket = new ServerSocket(4444);
         ss = serverSocket.accept();


         //in = new BufferedReader(new
InputStreamReader(ss.getInputStream()));
         in = new DataInputStream(ss.getInputStream());
         out = new DataOutputStream(ss.getOutputStream());
         //out = new PrintWriter(ss.getOutputStream());

         String fromClient;

         while ((fromClient = in.readLine()) != null)
         {
            out.writeBytes(fromClient + " received at server!");
            out.flush();
            System.out.println(fromClient);
         }

         serverSocket.close();
}
      catch (IOException e)
      {
         e.printStackTrace();
      }
   }
}


import java.io.*;
import java.net.*;

public class Client {

   public static void main(String[] args) {
      Socket socket = null;
      DataOutputStream out = null; // use PrintWriter.
      DataInputStream in = null; // use BufferedReader.
      BufferedReader user = null;
      try
      {
         String fromServer, fromUser;

         // Connect to server.
         socket = new Socket("localhost",4444);

      // Out channel.
         out = new DataOutputStream(socket.getOutputStream());

      // In channel.
         in = new DataInputStream(socket.getInputStream());

         // Input from user.
      user = new BufferedReader(new InputStreamReader(System.in));

      while ((fromUser = user.readLine()) != null)
      {
         out.writeBytes(fromUser);
         out.flush();

         fromServer = in.readLine();
         System.out.println(fromServer);
      }


      }
      catch(Exception e)
      {
         System.out.println(e.getMessage());
      }
   }

}


Andreas Plesner Jaco~ (18-09-2006)
Kommentar
Fra : Andreas Plesner Jaco~


Dato : 18-09-06 13:05

On 2006-09-18, bob <eksamor@yahoo.com> wrote:
>
> Jeg har lavet et tilsvarende eksempel hvor jeg bruger DataOutputStream
> og DataInputStream. Hvad er årsagen til at de ikke fungere med disse
> objeckter? Det fungere fint hvis jeg holder mig til at bruge
> PrintWriter og BufferedReader, men med DataIn/Out går det galt:

Hvorfor vil du bruge Data(In|Out)putStream? Er du klar over hvad de
klasser skal bruges til?

--
Andreas

bob (18-09-2006)
Kommentar
Fra : bob


Dato : 18-09-06 13:11


Andreas Plesner Jacobsen skrev:

> On 2006-09-18, bob <eksamor@yahoo.com> wrote:
> >
> > Jeg har lavet et tilsvarende eksempel hvor jeg bruger DataOutputStream
> > og DataInputStream. Hvad er årsagen til at de ikke fungere med disse
> > objeckter? Det fungere fint hvis jeg holder mig til at bruge
> > PrintWriter og BufferedReader, men med DataIn/Out går det galt:
>
> Hvorfor vil du bruge Data(In|Out)putStream? Er du klar over hvad de
> klasser skal bruges til?
>
> --
> Andreas

hmm fandt udad at man bare tilføjere "\n" til sit output så fungere
det.

Grunden til at jeg vil bruge DataOut/In er at jeg forventer at bruge
byte[] i stedet for strings på et tidspunkt og det skulle være
nemmere med DataOut/In


Andreas Plesner Jaco~ (18-09-2006)
Kommentar
Fra : Andreas Plesner Jaco~


Dato : 18-09-06 13:15

On 2006-09-18, bob <eksamor@yahoo.com> wrote:
>
> Grunden til at jeg vil bruge DataOut/In er at jeg forventer at bruge
> byte[] i stedet for strings på et tidspunkt og det skulle være
> nemmere med DataOut/In

Jeg tror du skal læse lidt om forskellen på reader/writer og
input/outputstreams, prøv her:
http://java.sun.com/docs/books/tutorial/essential/io/charstreams.html

Og jeg tror ikke at Data(In|Out)putStream er det rette valg.

--
Andreas

bob (18-09-2006)
Kommentar
Fra : bob


Dato : 18-09-06 15:46


Andreas Plesner Jacobsen skrev:

> On 2006-09-18, bob <eksamor@yahoo.com> wrote:
> >
> > Grunden til at jeg vil bruge DataOut/In er at jeg forventer at bruge
> > byte[] i stedet for strings på et tidspunkt og det skulle være
> > nemmere med DataOut/In
>
> Jeg tror du skal læse lidt om forskellen på reader/writer og
> input/outputstreams, prøv her:
> http://java.sun.com/docs/books/tutorial/essential/io/charstreams.html
>
> Og jeg tror ikke at Data(In|Out)putStream er det rette valg.
>
> --
> Andreas

PrintWriter understøtter ikke at sende et byte[] men det gør
DataOutputStream derimod. Kan ikke lige se hvordan jeg ellers skulle
sende et byte[] og være sikker på at modtagere får det korrekte data.


Andreas Plesner Jaco~ (18-09-2006)
Kommentar
Fra : Andreas Plesner Jaco~


Dato : 18-09-06 15:56

On 2006-09-18, bob <eksamor@yahoo.com> wrote:
>
>> Jeg tror du skal læse lidt om forskellen på reader/writer og
>> input/outputstreams, prøv her:
>> http://java.sun.com/docs/books/tutorial/essential/io/charstreams.html
>>
>> Og jeg tror ikke at Data(In|Out)putStream er det rette valg.
>
> PrintWriter understøtter ikke at sende et byte[] men det gør
> DataOutputStream derimod.

Nej. Læste du overhovedet i tutorialen? Reader/writer-klasser er til
*character*-streams
(http://java.sun.com/docs/books/tutorial/essential/io/charstreams.html),
mens input/output-klasserne håndterer *byte*-streams
(http://java.sun.com/docs/books/tutorial/essential/io/bytestreams.html).

> Kan ikke lige se hvordan jeg ellers skulle sende et byte[] og være
> sikker på at modtagere får det korrekte data.

Jeg ville nok bruge ByteArray(In|Out)putStream til at sende bytearrays
(igen alt efter hvad du vil opnå). Data(In|Out)putStreams er skrevet med
et andet formål i sigte.

--
Andreas

Andreas Plesner Jaco~ (18-09-2006)
Kommentar
Fra : Andreas Plesner Jaco~


Dato : 18-09-06 16:33

On 2006-09-18, Andreas Plesner Jacobsen <apj@daarligstil.dk> wrote:

>> Kan ikke lige se hvordan jeg ellers skulle sende et byte[] og være
>> sikker på at modtagere får det korrekte data.
>
> Jeg ville nok bruge ByteArray(In|Out)putStream til at sende bytearrays
> (igen alt efter hvad du vil opnå). Data(In|Out)putStreams er skrevet med
> et andet formål i sigte.

Hov, der var jeg for hurtig; jeg mente en Buffered(In|Out)putStream

--
Andreas

bob (18-09-2006)
Kommentar
Fra : bob


Dato : 18-09-06 16:24


Andreas Plesner Jacobsen skrev:

> On 2006-09-18, bob <eksamor@yahoo.com> wrote:
> >
> >> Jeg tror du skal læse lidt om forskellen på reader/writer og
> >> input/outputstreams, prøv her:
> >> http://java.sun.com/docs/books/tutorial/essential/io/charstreams.html
> >>
> >> Og jeg tror ikke at Data(In|Out)putStream er det rette valg.
> >
> > PrintWriter understøtter ikke at sende et byte[] men det gør
> > DataOutputStream derimod.
>
> Nej. Læste du overhovedet i tutorialen? Reader/writer-klasser er til
> *character*-streams
> (http://java.sun.com/docs/books/tutorial/essential/io/charstreams.html),
> mens input/output-klasserne håndterer *byte*-streams
> (http://java.sun.com/docs/books/tutorial/essential/io/bytestreams.html).
>
> > Kan ikke lige se hvordan jeg ellers skulle sende et byte[] og være
> > sikker på at modtagere får det korrekte data.
>
> Jeg ville nok bruge ByteArray(In|Out)putStream til at sende bytearrays
> (igen alt efter hvad du vil opnå). Data(In|Out)putStreams er skrevet med
> et andet formål i sigte.
>
> --
> Andreas

Jeg har læst tutorialen men den beskriver ikke hvordan serveren læser
et byte[].

Jeg kan fx godt lave:

         String pp = "sally";
         byte [] vv = pp.getBytes();

         ByteArrayInputStream barr = new ByteArrayInputStream(vv);

men jeg skal jo bruge en out channel på min socket på klient siden og
en in channel på server siden - kan ikke lige se hvad det gavner at
pakke et byte[] ind i en ByteArrayInputStream.


bob (18-09-2006)
Kommentar
Fra : bob


Dato : 18-09-06 16:45


Andreas Plesner Jacobsen skrev:

> On 2006-09-18, Andreas Plesner Jacobsen <apj@daarligstil.dk> wrote:
>
> >> Kan ikke lige se hvordan jeg ellers skulle sende et byte[] og være
> >> sikker på at modtagere får det korrekte data.
> >
> > Jeg ville nok bruge ByteArray(In|Out)putStream til at sende bytearrays
> > (igen alt efter hvad du vil opnå). Data(In|Out)putStreams er skrevet med
> > et andet formål i sigte.
>
> Hov, der var jeg for hurtig; jeg mente en Buffered(In|Out)putStream
>
> --
> Andreas

Jeg har sådan en fætter:

      in = new BufferedReader(
             new InputStreamReader(
             socket.getInputStream()));

men der er ikke noget metoder til at læse bytes på "in".

Den her derimod:

inBytes = new DataInputStream(socket.getInputStream());

har fx readByte().

jeg har så forsøgt dette på serversiden:

         byte[] bb = null;
         byte b;
         int i = 0;
         while ((b= inBytes.readByte()) != 0)
         {
            bb[i] = b;
            i = i+1;


         }

men det spiller ikke. kan sku ikke få hivet de bytes ud som det går
så fint med at få sparket afsted på klient siden.


Andreas Plesner Jaco~ (18-09-2006)
Kommentar
Fra : Andreas Plesner Jaco~


Dato : 18-09-06 17:00

On 2006-09-18, bob <eksamor@yahoo.com> wrote:
>
>       in = new BufferedReader(
>              new InputStreamReader(
>              socket.getInputStream()));
>
> men der er ikke noget metoder til at læse bytes på "in".

http://java.sun.com/j2se/1.5.0/docs/api/java/io/BufferedInputStream.html#read(byte[],%20int,%20int)

--
Andreas

bob (18-09-2006)
Kommentar
Fra : bob


Dato : 18-09-06 17:21


Andreas Plesner Jacobsen skrev:

> On 2006-09-18, bob <eksamor@yahoo.com> wrote:
> >
> >       in = new BufferedReader(
> >              new InputStreamReader(
> >              socket.getInputStream()));
> >
> > men der er ikke noget metoder til at læse bytes på "in".
>
> http://java.sun.com/j2se/1.5.0/docs/api/java/io/BufferedInputStream.html#read(byte[],%20int,%20int)
>
> --
> Andreas

ups Jeg stener vist lidt for meget. Tak skal du ha!


bob (18-09-2006)
Kommentar
Fra : bob


Dato : 18-09-06 18:50


Andreas Plesner Jacobsen skrev:

> On 2006-09-18, bob <eksamor@yahoo.com> wrote:
> >
> >       in = new BufferedReader(
> >              new InputStreamReader(
> >              socket.getInputStream()));
> >
> > men der er ikke noget metoder til at læse bytes på "in".
>
> http://java.sun.com/j2se/1.5.0/docs/api/java/io/BufferedInputStream.html#read(byte[],%20int,%20int)
>
> --
> Andreas

...Iøvrigt. Min klient sender nu nogen bytes på denne måde:

         String pp = "sally";
         byte[] b = pp.getBytes();
         System.out.println("In bytes: " + b);
         int len = b.length;

         System.out.println("len from client " + len);

         outBytes.write(len);
         outBytes.flush();

         outBytes.write(b, 0, len);
         outBytes.flush();

Min server modtager dem:

         inBytes = new BufferedInputStream(socket.getInputStream());
         int len = inBytes.read();
         byte[] b = new byte[len];
         inBytes.read(b, 0, len);
System.out.println(b + " bytes received!");

Problemet er klienten udskriver bytes: In bytes: [B@179c285
mens serveren udskriver: [B@7b7072 bytes received!
det er jo ikke de samme bytes.

Konvertere jeg de motaget bytes på serveren til en String får jeg
"sally", hvilket jo er godt nok. Hvad kan det være at jeg ikke
modtager de samme bytes på serveren?


Filip Larsen (18-09-2006)
Kommentar
Fra : Filip Larsen


Dato : 18-09-06 20:19

bob skrev

String pp = "sally";
byte[] b = pp.getBytes();
System.out.println("In bytes: " + b);
int len = b.length;

System.out.println("len from client " + len);

outBytes.write(len);
outBytes.flush();

outBytes.write(b, 0, len);
outBytes.flush();

> Min server modtager dem:

inBytes = new BufferedInputStream(socket.getInputStream());
int len = inBytes.read();
byte[] b = new byte[len];
inBytes.read(b, 0, len);
System.out.println(b + " bytes received!");

> Problemet er klienten udskriver bytes: In bytes: [B@179c285
> mens serveren udskriver: [B@7b7072 bytes received!
> det er jo ikke de samme bytes.

For det første, det er ikke værdierne men derimod object-id for de to
arrays du ser. For at teste om du har overført det korrekte indhold må
du teste de enkelte elementer (eller skrive dem ud).

For det andet så er InputStream.write(int) og OutputStream.read()
metoder til at skrive og læse en enkelt byte (værdierne -128 til 127).
Du kan bruge DataInputStream og DataOutputStream dekoratorene til at
skrive og læse et helt integer ad gangen hvis ikke du selv ønsker at
skifte og udmaske de 4 bytes der er i et integer.

For det tredie så er der ingen garanti for, at
InputStream.read(byte[],int,int) læser det maksimale antal den må.
Metoden kan sagtens returnere efter at have læst et mindre antal bytes.
Her kan du bruge DataInputStream.readFully(byte[]) hvis du ønsker at
blokerer indtil hele arrayet er læst (læs dokumentationen for
beskrivelse af undtagelserne).

Held og lykke,

Mvh,
--
Filip Larsen



bob (18-09-2006)
Kommentar
Fra : bob


Dato : 18-09-06 21:37


Filip Larsen skrev:

> bob skrev
>
> String pp = "sally";
> byte[] b = pp.getBytes();
> System.out.println("In bytes: " + b);
> int len = b.length;
>
> System.out.println("len from client " + len);
>
> outBytes.write(len);
> outBytes.flush();
>
> outBytes.write(b, 0, len);
> outBytes.flush();
>
> > Min server modtager dem:
>
> inBytes = new BufferedInputStream(socket.getInputStream());
> int len = inBytes.read();
> byte[] b = new byte[len];
> inBytes.read(b, 0, len);
> System.out.println(b + " bytes received!");
>
> > Problemet er klienten udskriver bytes: In bytes: [B@179c285
> > mens serveren udskriver: [B@7b7072 bytes received!
> > det er jo ikke de samme bytes.
>
> For det første, det er ikke værdierne men derimod object-id for de to
> arrays du ser. For at teste om du har overført det korrekte indhold må
> du teste de enkelte elementer (eller skrive dem ud).
>
> For det andet så er InputStream.write(int) og OutputStream.read()
> metoder til at skrive og læse en enkelt byte (værdierne -128 til 127).
> Du kan bruge DataInputStream og DataOutputStream dekoratorene til at
> skrive og læse et helt integer ad gangen hvis ikke du selv ønsker at
> skifte og udmaske de 4 bytes der er i et integer.
>
> For det tredie så er der ingen garanti for, at
> InputStream.read(byte[],int,int) læser det maksimale antal den må.
> Metoden kan sagtens returnere efter at have læst et mindre antal bytes.
> Her kan du bruge DataInputStream.readFully(byte[]) hvis du ønsker at
> blokerer indtil hele arrayet er læst (læs dokumentationen for
> beskrivelse af undtagelserne).
>
> Held og lykke,
>
> Mvh,
> --


Ja sku! Nu kører det!! Den skønne DataOutputStream kan også
sende/læse integers med write/readInt()...var i fuld sving med at
finde en måde at konvertere et integer til byte[] så jeg kunne sende
det med BufferedOutputStream. Tak for hjælpen!


Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste