Dúvida em Socket

Pessoal, To com um ‘probleminha’ na utilização de sockets.

Seguinte, eu quero forçar meu cliente e utiliza apenas uma porta de conexão com o servidor, para isso fixei a porta de uso do cliente na 2000, como no código abaixo.Porém há um problema, se eu executo o cliente várias vezes ele lança uma exeção com a mensagem: “Address already in use: connect.”
O socket está ficando ‘preso’ ? O que estou fazendo de errado ou não há oq fazer?

(...)
try{
     InetAddress ia = InetAddress.getLocalHost();
     Socket netSocket = new Socket();
     netSocket = new Socket(host,port,ia,2000);
     br = new BufferedReader(new      InputStreamReader(netSocket.getInputStream()));
				pw = new PrintWriter( new OutputStreamWriter(netSocket.getOutputStream()));
				pw.println("Teste de Envio de mensagem de "+netSocket.getLocalAddress()+":"+netSocket.getLocalPort());
				pw.flush();
				closeAll();
}(...)
private void closeAll(){
		try {
			br.close();
			pw.close();
			netSocket.close();
                }catch(...)
}

No servidor:

try {
			ServerSocket ss = new ServerSocket(5555);
			Socket connection = null;
			while(true){
				connection = ss.accept();
				BufferedReader br = new BufferedReader(
                        new InputStreamReader(connection.getInputStream()));
				PrintWriter p = new PrintWriter(new                                     OutputStreamWriter(connection.getOutputStream()));
				System.out.println(br.readLine());
				connection.close();
			}
		} 

bom se não me engano o socket a principio por padrão
utiliza um conexão TCP/IP, ou seja, ele mantem um canal
ativo de comunicação, com isso a porta fica travada

cara uma dica para situações como essa…

você tem 3 possibilidades para tratar a questão
:arrow: sempre verificar e desconetar a conexão
:arrow: criar um singleton para gerenciar a conexão,
o qual irá conectar e desconetar, fornecendo um serviço
:arrow: criar um singleton que gerencie a conexão e mantenha
um canal de conexão ativo

:wink:

vejo um tutorial sobre singleton

[]´s

Tente usar uma porta diferente de 5555!

E pelo que vi seu servidor está em uma porta (5555) e o cliente em outra (2000), tem certeza que é isso mesmo?

Este erro ai é pq vc ja esta utilizando a porta q vc definiu no servidor !!! Tenta utilizar outra porta ou veja c seu servidor ainda nao esta rodando !

Jair,
Mas este é justamente o caso. Eu quero que meu cliente só utilize uma porta para se conectar (questão de firewall) e meu servidor uma fixa, no caso escolhi a 5555. Eu deixo o servidor rodando e envio mensagens do cliente, mas quando o cliente fecha ao meu ver a conexão na porta 2000 devia ser liberada para reuso.

Vou verificar isso que o AnjoSupremo falou…mas por gerenciar a conexão você diz o que? Eu por enquanto só quero enviar uma mensagem de texto por exemplo pela porta 2000 e meu servidor receber pela 5555. Como isso utilizando singleton funcionaria?

Porque por exemplo…eu iniciei o programa agora e enviei uma mensagem e encerrei o programa. Mas esqueci que devia enviar mais alguma coisa e quando inicio novamente a conexão fica presa?! Como seria essa gerência de conexões? Se pudesse esclarecer eu agradeceria :slight_smile:

Essa porta que você passa no construtor de Socket é a porta na qual ele vai se conectar, no caso tem que ser 5555!

Não cara, eu acho que você está se confundindo.

Pelo que eu sei de TCP/IP e Sockets funciona assim:
Cada Socket é descrito por um ip e uma porta. Por exemplo no cliente ele seria 10.10.140.10:2000 e me conecto no socket do servidor que é 10.10.142:5555. Eu não preciso necessariamente utilizar a mesma porta do servidor. Por exemplo, um servidor http utiliza a porta 80, isso não quer dizer que eu uso a porta 80 local para me conectar a ele. Mas essa não é a questão da minha dúvida em todo caso. To caçando um jeito de conseguir liberar a porta no cliente que utilizei e dei um socket.close() no final da conexão para utilizar novamente quando iniciar o cliente.
Valeu =)

Ahh, não prestei atenção direito, você está passando 4 parametros para o construtor, nesse caso é a porta local mesmo!

Isso aí =)
Só que ainda to com o problema de não liberar a porta local =(

É…acho que vou morrer na praia =)