Probleme mit Einlesen eines Strings über Sockets

girl2005

Erfahrenes Mitglied
Hallo Leute,

vielleicht könnte mir jemand helfen.
Ich habe einen Server und einen Client programmiert. Der Server soll einen String aus mehreren Zahlen schicken. der Client bekommt aber den String mit den Zahlen in einer anderen Rheinfolge.

hier sind die Codes:
Code:
import java.net.*;
import java.io.*;

 public class Server implements Runnable  
 {
 	private Socket client = null;
    private ServerSocket server;
    private PrintWriter im; 
    private BufferedReader in;
    String c;
    
    
    
    public Server() throws IOException{
    	server = new ServerSocket(7);
		System.out.println("warten auf Verbindungen");
		client = server.accept();
		System.out.println("Verbindung aufgebaut");
		
		in = new BufferedReader(new InputStreamReader(client.getInputStream()));
		im = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
		
    }
    public void close() throws IOException{
    	  
    	im.close();
    	server.close();
    	client.close();
    }
 	
   public void run()
   {
   	
   	 while(true){
	      String s ="500 1.33333333e+2 2.33333333e+3 3.33333333e+3 4.33333333e+3 5.33333333e+3 6.33333333e+3 7.33333333e+3 8.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 1.33333333e+3 ";
		  im.print(s);
		  try {
		  	Thread.sleep(250);
		  } catch (InterruptedException e) {
			e.printStackTrace();
		  }
	}
				
   }
   public static void main(String[] args) throws IOException{
   	
   	Thread t = new Thread(new Server());
   	t.start();
   	
   }
   	
 }

Code:
import java.io.*;
import java.net.*;

public class Client extends Thread
{   
        
   
    private Socket client = null;   
    private BufferedReader in;
    private PrintWriter im;
    private int zaehler = 0;
	
    
    
  public Client() throws IOException
  {
     client = new Socket("localhost",7);
     in = new BufferedReader(new InputStreamReader(client.getInputStream()));
     im = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
     start();
        
    }
    
    public void close() throws IOException
    {
        client.close();
              
    }
    
    public void run()
    {
    	
        int receive_ok;
        String s;
        try
        {
           char[] c =new char[844];	
           while((receive_ok =in.read(c,0,843))!= -1) {
           	   s = new String(c);
               System.out.println(s);
           }
        }
        catch (IOException e){}        
    } 

  public static void main(String[] args){
    	
    	try {
			new Client();
			} 
      catch (IOException e) {
			e.printStackTrace();
		}
    }
   
    
    
  
    }

Ich bin dankbar für jede Hilfe.
 

zeja

Erfahrenes Mitglied
Poste doch mal was du vom Server sendest und was du beim Client rausbekommst.
 

girl2005

Erfahrenes Mitglied
hi isch schicke einen langen String, er ist in dem geschriebenen Programm zu finden. Jedenfalls sieht der String so aus
Code:
500 1.33333333112 2.33333333113 3............1.33333333113

dann bekomme ich am anfang die richtige Rheinfolge.also:

Code:
500 1.33333333112 2.33333333113 3............1.33333333113

danach sieht das so aus:

Code:
1.33333333113 1.33333333113.....1.33333333113 1.33333333113 500 ......1.33333333113

und so weiter
 

zeja

Erfahrenes Mitglied
Für mich sieht das richtig aus.

Du bekommst beim ersten Mal einen Teil des Strings beim zweiten Mal den zweiten Teil und dann beginnts wieder mit dem ersten, der ja laufend neu geschickt wird.
 

girl2005

Erfahrenes Mitglied
hi,

nein, ich glaube du hast es falsch verstanden..ich bekomme den ganzen String, das sind 843 charchter, deshalb könnte ich nicht den ganzen String schreiben. und dann bekomme ich den String ganz anderes. die 500 . die am Anfang kommt, kommt dann irgendwo in der Mitte oder hinten.
sonst hast du eine Methode wie ich das Programm schreibe so dass ich den String genau bekomme wie ich es schicke?
 

zeja

Erfahrenes Mitglied
Der String ist 844 lang du liest aber nur 843. Das ist aber nicht alles...

Du möchtest 843/4 einlesen. Lass dir mal ausgeben was receive_ok liefert. Das sind die tatsächlich gelesenen bytes, und das sind teilweise weniger.

Füg mal im Server hinter
im.print(s);
ein
im.flush();
ein.

Das sorgt dafür dass alles wirklich direkt in den Stream geschrieben wird und somit auch wieder ausgelesen werden kann.
 

girl2005

Erfahrenes Mitglied
Hi super, vielen Danke, das funktioniert jetzt.

Kennest du dich vielleicht mit C oder C++ aus?
wenn ja, weisst was das Equivalent zu flush in C oder C++ ist ?

ich muss meine Client-Progarmm an einem Server vebinden und die Daten holen.
Der Server wird also in C oder C++ programmiert und der Client in Java.