Próbuję zaimplementować połączenie TCP, wszystko działa dobrze po stronie serwera, ale po uruchomieniu programu klienckiego (z komputera klienckiego) pojawia się następujący błąd:
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)
Próbowałem zmienić numer gniazda na wypadek, gdyby był używany, ale bezskutecznie, czy ktoś wie, co powoduje ten błąd i jak go naprawić.
Kod serwera:
//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);
}
}
}
}
}
Kod klienta:
//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
źródło
źródło
Odpowiedzi:
Ten wyjątek oznacza, że nie ma usługi nasłuchującej na adresie IP / porcie, z którym próbujesz się połączyć:
źródło
You have not started your server
, ale to rzeczywiście był dla mnie problem!Sprawdziłbym:
Najprostszym punktem wyjścia jest prawdopodobnie próba ręcznego połączenia z komputera klienckiego za pomocą telnet lub Putty. Jeśli to się powiedzie, problem tkwi w kodzie klienta. Jeśli nie, musisz dowiedzieć się, dlaczego tak się nie stało. Wireshark może ci w tym pomóc.
źródło
Musisz podłączyć gniazdo klienta do zdalnego serwera ServerSocket. Zamiast
Socket clientSocket = new Socket("localhost", 5000);
robić
Socket clientSocket = new Socket(serverName, 5000);
Klient musi połączyć się z nazwą serwera, która powinna pasować do nazwy lub adresu IP skrzynki, na której
ServerSocket
utworzono instancję (nazwa musi być dostępna z komputera klienta). BTW: To nie nazwa jest ważna, chodzi tylko o adresy IP ...źródło
ServerSocket
, zmodyfikowałem odpowiedź. Niemniej jednakclientSocket
nadal próbuje się połączyćlocalhost
.Miałem ten sam problem, ale naprawiłem serwer przed uruchomieniem klienta.
źródło
Chciałbym dodać do powyższych odpowiedzi jedno z moich doświadczeń -
„Hostowałem na moim serwerze na localhost i próbowałem połączyć się z nim za pomocą emulatora Androida , podając właściwy adres URL, taki jak
http://localhost/my_api/login.php
. Dostałem błąd odmowy połączenia ”Zwróć uwagę - kiedy właśnie przeszedłem do przeglądarki na PC i użyłem tego samego adresu URL (
http://localhost/my_api/login.php
) , otrzymałem poprawną odpowiedźProblemem w moim przypadku był termin,
localhost
który zastąpiłem adresem IP mojego serwera (ponieważ Twój serwer jest hostowany na twoim komputerze), co sprawiło, że jest on dostępny z mojego emulatora na tym samym komputerze.Aby uzyskać adres IP dla twojego komputera lokalnego, możesz użyć
ipconfig
polecenia na cmd, otrzymasz IPv4 coś w rodzaju 192.68.xx.yy Voila .. to adres IP twojego komputera, na którym hostujesz serwer. użyj go zamiast localhosthttp://192.168.72.66/my_api/login.php
Uwaga - nie będzie można uzyskać dostępu do tego prywatnego adresu IP z dowolnego węzła poza tym komputerem. (W razie potrzeby możesz użyć do tego Ngnix)
źródło
Miałem ten sam problem z brokerem Mqtt o nazwie vernemq. Ale rozwiązałem go, dodając następujące elementy.
$ sudo vmq-admin listener show
aby wyświetlić listę dozwolonych adresów IP i portów dla vernemq
$ sudo vmq-admin listener start port=1885 -a 0.0.0.0 --mountpoint /appname --nr_of_acceptors=10 --max_connections=20000
aby dodać dowolny adres IP i nowy port. teraz powinieneś być w stanie połączyć się bez problemu.
Mam nadzieję, że to rozwiąże twój problem.
źródło
Mam nadzieję, że moje doświadczenie może być dla kogoś przydatne. Napotkałem problem z tym samym śledzeniem stosu wyjątków i nie mogłem zrozumieć, o co chodzi. Serwer bazy danych, z którym próbowałem się połączyć, działał, a port był otwarty i akceptował połączenia.
Problem dotyczył połączenia z Internetem. Połączenie internetowe, którego używałem, nie mogło połączyć się z odpowiednim serwerem. Kiedy zmieniłem szczegóły połączenia, problem został rozwiązany.
źródło
W moim przypadku nadałem gniazdu nazwę serwera (w moim przypadku „raspberrypi”), a zamiast tego zrobił to adres IPv4 lub, aby określić, IPv6 został uszkodzony (nazwa została rozstrzygnięta na IPv6)
źródło
W moim przypadku musiałem umieścić znacznik wyboru
Expose daemon on tcp://localhost:2375 without TLS
w pobliżudocker
ustawienia (po prawej stronie paska zadań kliknij prawym przyciskiem myszydocker
, wybierzsetting
)źródło
dostałem ten błąd, ponieważ zamknąłem
ServerSocket
wewnątrz pętli for, która próbuje zaakceptować liczbę znajdujących się w niej klientów (nie skończyłem akceptować wszystkich wskazówek)więc uważaj, gdzie zamknąć Socket
źródło
Miałem ten sam problem, ale problem polegał na tym, że nie zamykałem obiektu gniazda. Po użyciu socket.close (); problem rozwiązany. Ten kod działa dla mnie.
ClientDemo.java
i ServerDemo.java
źródło
Zmieniłem sieć DNS i to rozwiązało problem
źródło
Miałem ten sam problem i okazało się, że było to spowodowane
catalina.out
niepoprawnym zezwoleniem pliku. Nie był zapisywalny przez użytkownika tomcat. Po naprawieniu uprawnień problem został rozwiązany. Dowiedziałem się, że jest to problem z uprawnieniami z dzienników wtomcat8-initd.log
pliku:/usr/sbin/tomcat8: line 40: /usr/share/tomcat8/logs/catalina.out: Permission denied
źródło
tomcat8-initd.log
pliku, podczas gdy dzienniki wyjściowe serwera zawierały dokładnie błąd wymieniony w pytaniu.Możliwe, że poprzednia instancja klienta nadal działa i nasłuchuje na porcie 5000.
źródło
BindException
na serwerze, a nieConnectException
na kliencie.