Threads wechseln

NiciB

Erfahrenes Mitglied
Hallo!

Ich habe ein kleines Programm geschrieben um die Funktion von Threads und Sockets zu verstehen!

Und zwar gibt es eine main-class die die Threads erzeugt.

Code:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;


public class lightarray {

	/**
	 * @param args
	 */

	public static void main(String[] args){				

	    Thread t1 =   new Thread( new server() );  
	    t1.  start();  

	    Thread t2 =   new Thread( new client() );  
	    t2.  start();

	}
}

eine weitere Klasse ist der Server der auf einem Port auf die Client Anfragen hört!

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

 class server implements Runnable{

	/**
	 * @param args
	 */
	public void run() {
		try{
		ServerSocket server = new ServerSocket(1234);
		while(true){
			Socket client = server.accept();
			InputStream input = client.getInputStream();
			OutputStream output = client.getOutputStream();
			int zahl1=input.read();
			int zahl2=input.read();			
			output.write(zahl1 + zahl2);	
			output.flush();
			System.out.println(input.read());
			System.out.println(input.read());
			server.close();
			input.close();
			output.close();
			
		}
		}catch (IOException e){
			System.out.print(e);
		}
	}	
}

die client Klasse soll Anfragen an den Server stellen können und dann eine Antwort erhalten. Und zwar sollen per Tastatur 2 Zahlen eingegeben werden, die dann zum Server geschickt werden, der sie zusammenzählt und ausgibt. Das funktioniert auch ganz gut, nur das Problem ist, dass ich nach der Ausgabe wieder zur Eingabe der nächsten 2 Zahlen kommen sollte und ich weiß nicht wie ich das hinkriege. Ich kann also immer eine Rechnung pro Programmstart durchführen!

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

public class client  implements Runnable{

	/**
	 * @param args
	 */
	int x,y;
	
	public void run() {		
		while(true){
		try{
		
		Socket server = new Socket("localhost", 1234);
		InputStream input = server.getInputStream();
		OutputStream output = server.getOutputStream();
		
		BufferedReader myInput = new BufferedReader(new InputStreamReader(System.in));
		System.out.print("x: ");
		x = Integer.parseInt(myInput.readLine());
		System.out.print("y: ");
		y = Integer.parseInt(myInput.readLine());
		output.write(x);
		output.write(y);		
		output.flush();
		System.out.println(input.read());
		System.out.println(input.read());
		server.close();
		input.close();
		output.close();	
		}catch (IOException e){
			System.out.print(e);
		}
		}
	}
}

Ich verwende 2 Threads da der eine immer auf einem Port auf Anfragen warten muss und beim anderen sollen die Eingaben gemacht werden. Es soll nach einer Rechenoperation wieder zum Eingabe-Thread gewechselt werden.
 
Hi,
versuche es mal damit die Zeile

Code:
server.close();

im Server durch ein

Code:
client.close();

zu ersetzen, dann sollte es laufen !

Viel Code von einer Klasse in die andere kopiert was ?
Da schleichen sich schnell fehler ein !

Ich würde auch erst die Streams schließen dann erst den Socket !

Immer andersherum wie beim öffnen !

Gruß JAdix
 
ich habe jetzt server.close(); durch client.close(); ersetzt. Die Streams schließe ich nun auch vor den Socket.

Leider komme ich aber immer noch nicht wieder zur Eingabe zurück, das Problem besteht also weiterhin.
 
Hallo,

Vorab, du wechselst ja nicht zwischen den Threads, sondern die Java-VM
führt parallel beide Threads aus !


Zum Fehler, du hast ein
Code:
System.out.println(input.read());
zuviel im client !

Da blockt der client-Thread dann im read() !
Bei mit funktioniert es ohne die Zeile dann !

Im übrigen Klassenbezeichnungen in Java - GROSS !

Gruß JAdix
 
super, danke! Jetzt funktioniert es!

Ich habe im Server auch noch diese Zeilen rausgelöscht:

Code:
System.out.println(input.read());
System.out.println(input.read());

die Klassen hab ich natürlich auch noch groß geschrieben...
 
Zurück