_fs
Outubro 20, 2003, 1:52pm
#1
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.
_fs
Outubro 20, 2003, 2:05pm
#3
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
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.
_fs
Outubro 20, 2003, 2:13pm
#7
Deve ser isso mesmo :mrgreen:
Um System.out( 0 ) não resolve pelo jeito, ne?
Tem que chamar o método close().
[]'s
_fs
Outubro 21, 2003, 11:41am
#10
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?
cv1
Outubro 21, 2003, 12:24pm
#11
Tente postar aqui o menor trecho de codigo que consiga reproduzir esse erro
_fs
Outubro 21, 2003, 12:31pm
#12
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 .
_fs
Outubro 21, 2003, 1:11pm
#14
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
louds
Outubro 21, 2003, 1:27pm
#15
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.
_fs
Outubro 21, 2003, 1:48pm
#16
Valeu Louds, vou pesquisar sobre isso
_fs
Outubro 21, 2003, 2:36pm
#17
Achei o erro … tão vendo o laço FOR que contém a criação do serversocket … entao …