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
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
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 =)