Klient -Server - nie wiem w którym miejscu zamknąć jeszcze socket

0

Witam.
Mam problem z zamknięciem socketa.
Mam taki przykładowy serwer.

 
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;


public class ThreadedEchoServer {

	/**
	 * 
	 */
	

	/**
	 * @param args
	 */
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		try
		{
			int i = 1;
		        ServerSocket s = new ServerSocket(8888);
			while(true)
			{
				Socket incoming = s.accept();
				Runnable r = new ThreadedEchoHandler(incoming,i);
				Thread t = new Thread(r);
				t.start();
				i++;
			}
			
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
	 
	}
}
	class ThreadedEchoHandler implements Runnable
	{

		/**
		 * 
		 * @param i
		 * @param c
		 */
		public ThreadedEchoHandler(Socket i, int c) {
			// TODO Auto-generated constructor stub
			incoming = i;
			counter =c;
			
		}

		
		public void run() {
			// TODO Auto-generated method stub
			try{
				try{
					ObjectInputStream inStream = new ObjectInputStream(incoming.getInputStream());
					try {
						Test obiekt = (Test) inStream.readObject();
						incoming.close();
						
					} catch (ClassNotFoundException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					incoming.close();
					inStream.close();
					
					
					
					
					
				}
				finally
				{
					incoming.close();
				}
			}
			catch(IOException e){
				e.printStackTrace();
			}
		}
			

i nie wiem w którym miejscu mam jeszcze zamknąć socket.
Wydaję mi się że wszystko powinno być ok. Jednak nie mogę dwa razy skompilować tego programu ponieważ za drugim razem wyskakuję komunikat:

java.net.BindException: Address already in use: JVM_Bind
at java.net.DualStackPlainSocketImpl.bind0(Native Method)
at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:96)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:175)
at java.net.ServerSocket.bind(ServerSocket.java:376)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at java.net.ServerSocket.<init>(ServerSocket.java:128)
at ThreadedEchoServer.main(ThreadedEchoServer.java:27)

Co jak przypuszczam oznacza że port jest zajęty bo nie został zwolniony przez poprzednie uruchomienie i zamknięcie aplikacji.
Eclipse również podpowiada mi że muszę zamknąć.
Zmienną ServerSocket s - ale nie mam pojęcia gdzie.
Pozdrawiam i dzięki za pomoc. ( Choć przypuszczam że to pewnie totalnie lamerskie pytanie :))

0

Nie rozumiem pytania. Przeciez ServerSocket s nie jest nigdzie u ciebie zamykany... Ale jeśli ubijasz aplikację to nie powinno być problemu z zajętym portem.

0

Nie mogą dwa serwery stać na jednym porcie, to oczywiste. Twoja aplikacja otwiera soket serwerowy.
Wniosek, nie możesz odpalić dwóch jej instancji na raz.

Jeśli ją zamknąłeś i otworzyłeś na nowo, a mimo to masz problem z bindem, to musisz trochę poczekać.

0

Zamknij sobie socket zaraz po zamknięciu strumieni.
Najlepiej w bloku finally{} zrób:

inStream.close(); //zamykasz strumień
incoming.close(); //zamykasz otwarte połączenie
s.close(); //zamykasz cały socket

Tylko ten cały socket musi być zmienną globalną, żeby był widoczny w momencie zamykania.

0

Wielkie dzięki za odpowiedź.
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1