Problem mit Socket und ServerSocket

mrno

Erfahrenes Mitglied
Hi,
ich habe mal wieder ein Problem mit Sockets.
habe folgenden quellcode:
Server:
Code:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server extends Thread{
	int port=0;
	public Server(){
		BufferedReader br=new BufferedReader(new InputStreamReader( System.in));
		try {
			port=Integer.parseInt(br.readLine());
			start();
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void run(){
		while(true){
			try {
				ServerSocket serverSocket = new ServerSocket(port);
				Socket socket=serverSocket.accept();
				ServerThread sT=new ServerThread(socket);
				sT.start();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
	public static void main(String args[]){
		new Server();
	}
}
class ServerThread extends Thread{
	Socket socket;
	public ServerThread(Socket s){
		socket=s;
	}
	public void run(){
		try {
			ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
			String s=ois.readObject().toString();
			ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
			oos.writeObject("Folgende dateien wurden empfangen:"+s);
			oos.flush();
			oos.close();
			socket.close();
			ois.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
Client:
Code:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;

public class Client {
	public Client(){
		System.out.print("Bitte Port eingeben:");
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		try {
			int port=Integer.parseInt(br.readLine());
			System.out.print("Ip eingeben:");
		String ip=br.readLine();
		System.out.print("Nachricht eingeben:");
		String text=br.readLine();
		Socket socket = new Socket();
		SocketAddress sa = new InetSocketAddress(ip,port);
		socket.connect(sa);
		ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
		oos.writeObject(text);
		oos.flush();
		ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
		String antwort=ois.readObject().toString();
		ois.close();
		oos.close();
		System.out.println(antwort);
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public static void main(String args[]){
		new Client();
	}
}
Fehlermeldung:
Code:
java.net.BindException: Address already in use
	at java.net.PlainSocketImpl.socketBind(Native Method)
	at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:359)
	at java.net.ServerSocket.bind(ServerSocket.java:319)
	at java.net.ServerSocket.<init>(ServerSocket.java:185)
	at java.net.ServerSocket.<init>(ServerSocket.java:97)
	at Server.run(Server.java:29)

Ich dachte bis jetzt das der ServerSocket die Socket-Verbindung über einen neuen Port abwickelt. Wenn ich den Socket in einem neuen Thread abarbeite müsste ich doch schon wieder an dem Standart port lauschen können. Was mache ich falsch?
 
Du brauchst nicht für jede Connection einen neuen ServerSocket. Es reicht, wenn du einmal einen erstellst und anschließend in der while-Schleife nur per "accept()" abfragst, ob jemand eine Verbindung aufnimmt.

Du musst also die Zeile:
ServerSocket serverSocket = new ServerSocket(port);

aus der while-Schleife entfernen und an einer Stelle davor einfügen.

Gruß, Blandorin
 
Zurück