Address already in use

Oi, boa tarde.

Seguinte, tenho um SocketServer que, ao executá-lo, o seguinte erro ocorre:

“java.net.BindException: Address already in use: JVM_Bind”

Só funciona quando mudo o número da porta.

Eu entendi que a JVM já está usando aquela porta … como evitar isso?

Não é necessariamente a JVM que pode estar usando tal porta. Outra aplicação qualquer (banco de dados, servidor de aplicação, algum serviço do seu sistema operacional) pode estar carregada nesta porta. Dica: procure usar portas com números maiores do que 1024.

Valeu pelo reply cara, mas o problema não é esse, não expliquei direito.

Eu executo com a porta 5000 por exemplo, e ele roda normal. Se eu fechar a aplicação e abri-la novamente, este erro acontece.

Então eu mudo a porta e executo. Se fechar e tentar rodar de novo, dá o mesmo erro :expressionless:

Posta o seu código aí. Mas você fecha o seu socket quando sua aplicação é finalizada?

Bom, eu não tenho certeza, mas pelo jeito, a conexão na tal porta não está sendo fechada… :roll:

entao o problema he q qnd vc fecha a aplicacao, vc nao esta terminando-a.

Deve ser isso mesmo :mrgreen:

Um System.out( 0 ) não resolve pelo jeito, ne?

Tem que chamar o método close(). :smiley:

[]'s

Valeu!

Ok, agora o erro é pior … não importa a porta que eu coloque ( números totalmente bizarros, mas dentro do range, claro ) ele acusa o mesmo erro.

Não consigo nem executar o Server =|

Alguém sabe o que pode estar acontecendo?

Tente postar aqui o menor trecho de codigo que consiga reproduzir esse erro :wink:

Não reparem, eu = n00b

Tirei as caquinhas

public class Server extends JFrame
{	
	private int Conns = 50;
	private Vip vip[];
	
	private ServerSocket server;
	
	public Server()
	{
		for( int i = 0; i < Conns; i++ )
		{
			try
			{
				server = new ServerSocket( 60000, Conns );
			}
			catch( IOException e )
			{
				e.printStackTrace();
				System.exit( 1 );
			}
		}
	}
	
	public void execute()
	{
		for( int i = 0; i < Conns; i++ )
		{
			try
			{
				vip[ i ] = new Vip( server.accept() );
				vip[ i ].start();
			}
			catch( IOException e )
			{
				e.printStackTrace();
				System.exit( 1 );
			}
		}
	}		

	
	public static void main( String args[] )
	{
		Server chat = new Server();
		
		
		chat.execute();
	}
}
	
class Vip extends Thread
{
	private Socket skt;
	private ObjectInputStream input;
	private ObjectOutputStream output;
	private Server serv = new Server();
	
	public Vip( Socket s )
	{
		skt = s;
	
		try
		{
			while( true )
			{
				output = new ObjectOutputStream( skt.getOutputStream() );
				output.flush();
				
				input = new ObjectInputStream( skt.getInputStream() );
				serv.display.append( "
Got I/O streams
" );

				output.writeObject( message );
				output.flush();
			}
		}
		catch( IOException e )
		{
			e.printStackTrace();
			System.exit( 1 );
		}
	}
	
	public void run()
	{
		String message = "";
		
		try
		{
			input = new ObjectInputStream( skt.getInputStream() );
			message = ( String ) input.readObject();
			
			serv.display.setCaretPosition( serv.display.getText().length() );
		}
		catch( ClassNotFoundException cnfex )
		{
			cnfex.printStackTrace();
		}
		catch( IOException e )
		{
			e.printStackTrace();
		}
	}
}

Meu deus!! Você tem que dar um close() no seu ServerSocket quando a aplicação fechar :slight_smile: .

Eu coloquei hehe só tirei umas partes para não ficar muito gigante aqui.

Então, não é igual ao problema anterior, ele simplesmente não aceita.

E outro serverzinho mais simples que tenho aqui abre normal com qualquer porta que não funciona neste que eu postei … por isso que estou ficando louco :frowning:

O socket é fechado junto com a VM.
Você não tá setando a flag SO_REUSE_ADDR, ou com nome parecido, do ServerSocket, sem isso a porta fica bloqueada para bind por alguns minutos depois da JVM morrer.

Valeu Louds, vou pesquisar sobre isso :slight_smile:

Achei o erro … tão vendo o laço FOR que contém a criação do serversocket … entao … :expressionless: