| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | 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 |  
  |   |   |   
            
        
 
            
         
            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 |  
  |   |   |   
            
        
 
            
         
           bob (18-09-2006) 
         
	
            | Kommentar Fra : bob | 
  Dato :  18-09-06 17:21 |  
  |   |   |   
            
        
 
            
         
           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!
 
  
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |