# Multithreaded TCP Server



## JasminM (29. Mrz 2015)

Das ist eine Klausuraufgabe, die ich lösen möchte, also keine Hausaufgabe. 
Nachfolgend soll eine TCP Server zur Berechnung von Primzahlen implementiert werden. Der TCP-Server berechnet also die Primzahlen (Methode muss nicht implementiert werden) und der TCP Client übermittelt dem Server eine Zahl n, von dem der Server die ersten n Primzahlen berechnet. Die Zahlen werden an den Client zurück gesendet, der dann sowohl die gesendet Zahl als auch die empfangenen Primzahlen ausgibt. Überall wo LÜCKE steht, muss man etwas ausfüllen.

Der Client

```
public class PrimeNumberTCPClient {
	 
	 Socket socket;
	 
	 public static void main(String[] args) throws UnknownHostException, IOException{
		 
		 int n = (int)(Math.random()*100);
		 @SuppressWarnings("resource")
		Socket socket = new Socket("localhost", 6543);
		 
		 DataInputStream din = new DataInputStream(socket.getInputStream());
		 DataOutputStream dout = new DataOutputStream(socket.getOutputStream());
		 
		 LÜCKE		 
		  
		 int[] primeArray = 
		 
		 LÜCKE

		 for(int i=0; i<primeArray.length; i++){
			 
			System.out.println("Primenumber at client: " + primeArray[i]);
		 }
		 
	 }
 }
```


Der Server


```
public class PrintNumberTCPServer {
	
	public static void main(String[] args){
		
		ServerSocket s = null;
		
		try{
			s = new ServerSocket(6543);
			
			LÜCKE
			
			
		}catch(IOException ioe){};
	}

}
```


und die Thread-Klasse


```
public class PrimeNumberTCPServerThread extends Thread {
	
	static int[] getPrimeArray(int n){
		return null;
		// Gibt die ersten n Primzahlen als Array zurück
		// Hinweis: Funktion muss nicht implementiert werden
	}
	
	Socket socket;
	
	public PrimeNumberTCPServerThread(Socket socket){
		this.socket = socket;
	}
	
	@Override
	
	public void run(){
		
		try{
			
			DataInputStream din = new DataInputStream(socket.getInputStream());
			DataOutputStream dout = new DataOutputStream(socket.getOutputStream());
			
			LÜCKE
		
		}catch(IOException e){}
		
		
	}

}
```


----------



## JasminM (29. Mrz 2015)

Meine Lösung für den Client:


```
package Klausuren;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

 public class PrimeNumberTCPClient {
	 
	 Socket socket;
	 
	 public static void main(String[] args) throws UnknownHostException, IOException{
		 
		 int n = (int)(Math.random()*100);
		 @SuppressWarnings("resource")
		Socket socket = new Socket("localhost", 6543);
		 
		 DataInputStream din = new DataInputStream(socket.getInputStream());
		 DataOutputStream dout = new DataOutputStream(socket.getOutputStream());
		 
		 socket.getInputStream(); 
		 socket.getOutputStream();
		  
		
		 
		  
		 int[] primeArray = new int[n]; 
		 
         dout.writeInt(n);
		 
		 dout.flush();
		   
		 for(int i=0;i<n;i++) { 
		 int temp = din.readInt(); 
		 primeArray[i] = temp; 
		    } 
		  
		 
		 
		 for(int i=0; i<primeArray.length; i++){
			 
			System.out.println("Primenumber at client: " + primeArray[i]);
		 }
		 
	 }
 }
```

Beim Server und bei der Thread-Klasse bin ich mir absolut nicht sicher, wie ich da vorgehen soll. 
Ich weiß, dass ich die accept-Methode benutzen, den Stream abgreifen und den Thread starten muss. Aber wie genau ich da vorgehen soll, ist mir ein wenig zu hoch. Ich bin für jede Hilfe dankbar.


----------



## JasminM (29. Mrz 2015)

Hier meine Lösung (eine Nacht darüber schlafen und alles wirkt einfacher  )

Client:

```
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

 public class PrimeNumberTCPClient {
	 
	 Socket socket;
	 
	 public static void main(String[] args) throws UnknownHostException, IOException{
		 
		 int n = (int)(Math.random()*100);
		 @SuppressWarnings("resource")
		Socket socket = new Socket("localhost", 6543);
		 
		 DataInputStream din = new DataInputStream(socket.getInputStream());
		 DataOutputStream dout = new DataOutputStream(socket.getOutputStream());
		
		 
		  
		 int[] primeArray = new int[n]; 
		 
         dout.writeInt(n);
		
         
        for(int j = 0; j < primeArray.length; j++){
        	
        	int temp = din.readInt();
        	primeArray[j]=temp;
        }
		 
		 for(int i=0; i<primeArray.length; i++){
			 
			System.out.println("Primenumber at client: " + primeArray[i]);
		 }
		 
	 }
 }
```

Server:


```
import java.io.IOException;
import java.net.ServerSocket;


public class PrintNumberTCPServer {
	
	public static void main(String[] args){
		
		ServerSocket s = null;
		
		try{
			s = new ServerSocket(6543);
			
			while(true){
				
				new PrimeNumberTCPServerThread(s.accept()).start();
				
			}


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

}
```

Thread:


```
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class PrimeNumberTCPServerThread extends Thread {
	
	static int[] getPrimeArray(int n){
		
		int[] array = new int[n];
		
		for(int i=0; i<n; i++){
			
			array[i] = (int)(Math.random()*100);
			
		}
		
		
		return array;
		
		// Gibt die ersten n Primzahlen als Array zurück
		// Hinweis: Funktion muss nicht implementiert werden
	}
	
	Socket socket;
	
	public PrimeNumberTCPServerThread(Socket socket){
		this.socket = socket;
	}
	
	@Override
	
	public void run(){
		
		try{
			
			DataInputStream din = new DataInputStream(socket.getInputStream());
			DataOutputStream dout = new DataOutputStream(socket.getOutputStream());
			
			int temp = din.readInt();
			int[] feld = new int[temp];
			
			getPrimeArray(temp);
			
			for(int i = 0; i < feld.length; i++){
				
				dout.writeInt(feld[i]);
			}
			 
		
		
		}catch(IOException e){}
		
		
	}

}
```


----------

