Estou tentando implementar uma conexão TCP, tudo funciona bem do lado do servidor, mas quando executo o programa cliente (do computador cliente), recebo o seguinte erro:
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
at java.net.Socket.connect(Socket.java:529)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.<init>(Socket.java:375)
at java.net.Socket.<init>(Socket.java:189)
at TCPClient.main(TCPClient.java:13)
Tentei alterar o número do soquete no caso de estar em uso, mas sem sucesso, alguém sabe o que está causando esse erro e como corrigi-lo.
O código do servidor:
//TCPServer.java
import java.io.*;
import java.net.*;
class TCPServer {
public static void main(String argv[]) throws Exception {
String fromclient;
String toclient;
ServerSocket Server = new ServerSocket(5000);
System.out.println("TCPServer Waiting for client on port 5000");
while (true) {
Socket connected = Server.accept();
System.out.println(" THE CLIENT" + " " + connected.getInetAddress()
+ ":" + connected.getPort() + " IS CONNECTED ");
BufferedReader inFromUser = new BufferedReader(
new InputStreamReader(System.in));
BufferedReader inFromClient = new BufferedReader(
new InputStreamReader(connected.getInputStream()));
PrintWriter outToClient = new PrintWriter(
connected.getOutputStream(), true);
while (true) {
System.out.println("SEND(Type Q or q to Quit):");
toclient = inFromUser.readLine();
if (toclient.equals("q") || toclient.equals("Q")) {
outToClient.println(toclient);
connected.close();
break;
} else {
outToClient.println(toclient);
}
fromclient = inFromClient.readLine();
if (fromclient.equals("q") || fromclient.equals("Q")) {
connected.close();
break;
} else {
System.out.println("RECIEVED:" + fromclient);
}
}
}
}
}
O Código do Cliente:
//TCPClient.java
import java.io.*;
import java.net.*;
class TCPClient {
public static void main(String argv[]) throws Exception {
String FromServer;
String ToServer;
Socket clientSocket = new Socket("localhost", 5000);
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(
System.in));
PrintWriter outToServer = new PrintWriter(
clientSocket.getOutputStream(), true);
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
while (true) {
FromServer = inFromServer.readLine();
if (FromServer.equals("q") || FromServer.equals("Q")) {
clientSocket.close();
break;
} else {
System.out.println("RECIEVED:" + FromServer);
System.out.println("SEND(Type Q or q to Quit):");
ToServer = inFromUser.readLine();
if (ToServer.equals("Q") || ToServer.equals("q")) {
outToServer.println(ToServer);
clientSocket.close();
break;
} else {
outToServer.println(ToServer);
}
}
}
}
}
java
networking
tcp
Samantha Catania
fonte
fonte
Respostas:
Essa exceção significa que não há serviço atendendo na porta / IP à qual você está tentando se conectar:
fonte
You have not started your server
assunto, mas foi realmente o problema para mim!Eu verificaria:
O ponto de partida mais simples é provavelmente tentar se conectar manualmente a partir da máquina cliente usando telnet ou Putty. Se isso der certo, o problema está no código do seu cliente. Caso contrário, você precisa descobrir por que não. O Wireshark pode ajudá-lo nessa frente.
fonte
Você precisa conectar o soquete do cliente ao ServerSocket remoto. Ao invés de
Socket clientSocket = new Socket("localhost", 5000);
Faz
Socket clientSocket = new Socket(serverName, 5000);
O cliente deve se conectar ao serverName, que deve corresponder ao nome ou IP da caixa na qual sua
ServerSocket
instância foi instanciada (o nome deve estar acessível na máquina do cliente). BTW: Não é o nome que é importante, é tudo sobre endereços IP ...fonte
ServerSocket
, eu modifiquei a resposta. No entanto, oclientSocket
ainda tenta se conectarlocalhost
.Eu tive o mesmo problema, mas executar o servidor antes de executar o cliente o corrigiu.
fonte
Um ponto que gostaria de acrescentar às respostas acima é a minha experiência -
"Hospedei no meu servidor no host local e estava tentando conectar-me a ele através de um emulador do Android , especificando o URL adequado
http://localhost/my_api/login.php
. E estava recebendo erro de conexão recusada "Aponte para observação - Quando fui ao navegador no PC e usei a mesma URL (
http://localhost/my_api/login.php
) , estava obtendo resposta corretaportanto, o problema no meu caso foi o termo
localhost
que substituí pelo IP do meu servidor (como o servidor está hospedado na sua máquina) que o tornou acessível a partir do meu emulador no mesmo PC.Para obter IP para a sua máquina local, você pode usar o
ipconfig
comando cmd para obter o IPv4 algo como 192.68.xx.yy Voila .. esse é o IP da sua máquina em que o servidor está hospedado. use-o então em vez de localhosthttp://192.168.72.66/my_api/login.php
Nota - você não poderá alcançar esse IP privado a partir de qualquer nó fora deste computador. (Caso você precise, você pode usar o Ngnix para isso)
fonte
Eu tive o mesmo problema com o broker Mqtt chamado vernemq.but resolveu adicionando o seguinte.
$ sudo vmq-admin listener show
para mostrar a lista de ips e portas permitidos para o vernemq
$ sudo vmq-admin listener start port=1885 -a 0.0.0.0 --mountpoint /appname --nr_of_acceptors=10 --max_connections=20000
para adicionar qualquer ip e sua nova porta. agora você deve conseguir se conectar sem nenhum problema.
Espero que resolva o seu problema.
fonte
Espero que minha experiência possa ser útil para alguém. Enfrentei o problema com o mesmo rastreamento de pilha de exceção e não conseguia entender qual era o problema. O servidor de banco de dados que eu estava tentando conectar estava em execução e a porta estava aberta e estava aceitando conexões.
O problema foi com a conexão à Internet. A conexão à Internet que eu estava usando não tinha permissão para se conectar ao servidor correspondente. Quando alterei os detalhes da conexão, o problema foi resolvido.
fonte
No meu caso, dei ao soquete o nome do servidor (no meu caso "raspberrypi") e, em vez disso, um endereço IPv4 o criou ou, para especificar, o IPv6 foi quebrado (o nome foi resolvido para um IPv6)
fonte
No meu caso, eu tive que colocar uma marca de seleção próxima
Expose daemon on tcp://localhost:2375 without TLS
nadocker
configuração (no lado direito da barra de tarefas, clique com o botão direito do mouse emdocker
, selecionesetting
)fonte
eu recebi esse erro porque fechei
ServerSocket
dentro de um loop for que tentava aceitar o número de clientes dentro dele (não terminei de aceitar todas as clints)tenha cuidado onde fechar seu soquete
fonte
Eu tive o mesmo problema e o problema era que eu não estava fechando o objeto socket. Depois de usar o socket.close (); problema resolvido. Este código funciona para mim.
ClientDemo.java
e ServerDemo.java
fonte
Mudei minha rede DNS e resolveu o problema
fonte
Eu tive o mesmo problema e acabou por ser devido à permissão do
catalina.out
arquivo não estar correto. Não foi gravável pelo usuário do tomcat. Depois de corrigir as permissões, o problema foi resolvido. Eu soube que é um problema de permissão dos logs notomcat8-initd.log
arquivo:/usr/sbin/tomcat8: line 40: /usr/share/tomcat8/logs/catalina.out: Permission denied
fonte
tomcat8-initd.log
arquivo enquanto os logs de saída do servidor tinham exatamente o erro mencionado na pergunta.Pode ser que exista uma instância anterior do cliente ainda em execução e escutando na porta 5000.
fonte
BindException
no servidor, não aConnectException
no cliente.