Multiple Clients and one Server --> java.lang.NullPointerException

GoldiMM

Mitglied
Hallo

Ich möchte gerne mehrere Clients mit dem Server verbinden und zwischen diesen Objekte hin und her schicken. Das Problem das ich momentan habe ist, dass sich der erste Client mit dem Server erfolgreich verbindet und auch ein erstes String-Objekte an den Server schickt und dieses String-Objekt auch wieder zurückerhält. Sobald ich aber einen zweiten Client starte bekomme ich eine java.lang.NullPointerException. Ich finde leider den Fehler nirgends. Könnt ihr mir sage was ich übersehe?

Java:
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

@SuppressWarnings("serial")
public class Client {
	
	//Attribute
   Socket socket;
   Object inputObject;
   ObjectInputStream in;
   ObjectOutputStream out;
	
	public static GameObject gObject;
	public static int counter = 0;
	

	//Konstruktor
	public Client(String hostName, int portNumber) {
		connect(hostName, portNumber);
		counter++;
		sendAndReceiceMessageServer();  
	}
	
	//Main-Methode
	public static void main(String[] args) {
		String hostName = "localhost";
		int portNumber = 50001;
		new Client(hostName, portNumber);
		
	}
	
	//Methoden
	public void connect(String hostName, int portNumber) {
		try {
			//Create a new socket, connect immediately
			socket = new Socket(hostName, portNumber);  
		
		// Create reader and writer for the socket
			in = new ObjectInputStream(socket.getInputStream());
			out = new ObjectOutputStream(socket.getOutputStream());
			
			String t= "Hallo ich bin der Client";
			out.writeObject(t);
			out.flush();
		}
		catch (Exception e) {
			
		}
	}
	
	
	public void sendAndReceiceMessageServer() {    
		try {
		
		//Read and display the reply from the server
		while ((inputObject = in.readObject()) != null) {
			
			if (inputObject instanceof String) {
				String ausgabe = (String) inputObject;
				
				System.out.println(ausgabe);
				
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
			}	
		}
		
		//Clean up
		//in.close();
		//out.close();
		//socket.close();
		
	}  catch (Exception e) {
		System.out.println(e.toString());
		System.exit(1);
	}
	}
	
}

******************************************************

Java:
import java.io.IOException;
import java.net.ServerSocket;

public class Server {


	public static void main(String[] args) throws IOException{
		
		int portNumber = 50001; // dynamic ports from 49152–65535
		
        try (ServerSocket serverSocket = new ServerSocket(portNumber)) { // create ServerSocket
           
        	new ServerThread(serverSocket.accept()).start(); // set up connection and start run method

        } catch (IOException e) {
            System.err.println("Could not listen on port " + portNumber);
            System.exit(-1);
        }
	}
}

******************************************************

Java:
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;

public class ServerThread extends Thread{

	//attributes
	private Socket socket;   // = null;
	public static ArrayList<String> ausgabeList = new ArrayList<String>(2);
	public static ArrayList<ObjectOutputStream> outlist = new ArrayList<ObjectOutputStream>(2);

	
	//constructor
	public ServerThread(Socket socket) {
		this.socket = socket;
	}
	
	public void run() {
		try{
			
			ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
			out.flush();
			outlist.add(out);

			ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
			
			Object inputObject;
			
			//***
			try {
				
				while ((inputObject = in.readObject()) != null) {
					
					//String object
					if (inputObject instanceof String) {
						String ausgabe = (String) inputObject ;
						System.out.println(ausgabe);
						ausgabe = ausgabe +  " und bin jetzt verbunden mit dem Server!";
						//ausgabeList.add(ausgabe);
						
						
						out.writeObject(ausgabe);
						
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}				
						
					}				
					}
				
				
			}catch (Exception e) {
				
			}
			
		}
			catch (Exception e){
			
		}
	
	}

}
 
dein Problem ist, dass du hiermit:
Java:
try (ServerSocket serverSocket = new ServerSocket(portNumber)) { // create ServerSocket
           
            new ServerThread(serverSocket.accept()).start(); // set up connection and start run method
 
        } catch (IOException e) {
            System.err.println("Could not listen on port " + portNumber);
            System.exit(-1);
        }
auf eine Verbindung zum Server wartest, und wenn diese erfolgt an ServerThread weitergibst und dann den catch block verlässt ( serverSocket.accept() wartet nur einmalig auf eine Verbindung ).

Was du machen musst, ist das warten auf Verbindungen ebenfalls in einem Thread zu realisieren, damit du immer wieder neue Verbindungen aufnehmen kannst

Grüße, key
 
Zuletzt bearbeitet:

Zurück
Oben