1
votes

Les sockets Java ne peuvent pas accéder au serveur à l'aide de l'adresse IP du sous-réseau

En utilisant JDK 10, j'essaie d'écrire un programme client / serveur qui s'exécutera séparément sur plusieurs ordinateurs en utilisant des sockets TCP / IP.

Tous les ordinateurs doivent être dans le même sous-réseau local 192.168.1.x (où x peut être varie entre 1 et 254).

Les serveurs individuels reçoivent une chaîne du programme client et impriment la chaîne.

ServerThread.java:

Exception in thread "main" java.net.ConnectException: Operation timed out (Connection timed out)
    at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:400)
    at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:243)
    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:225)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:402)
    at java.base/java.net.Socket.connect(Socket.java:591)
    at java.base/java.net.Socket.connect(Socket.java:540)
    at java.base/java.net.Socket.<init>(Socket.java:436)
    at java.base/java.net.Socket.<init>(Socket.java:246)
    at com.sample.Client.connect(Client.java:13)
    at com.sample.Client.main(Client.java:26)


1 commentaires

«Connexion refusée» a exactement une signification: rien n'écoutait sur l'hôte: port ou adresse IP: port auquel vous avez essayé de vous connecter. Donc soit vous n'avez pas démarré le serveur, soit vous avez son adresse: port incorrect dans le client.


3 Réponses :


-1
votes

L'erreur est de supposer que le constructeur Socket utilise à la fois l'IP et le nom d'hôte, en réalité:

new Socket(InetAddress.getByName("192.168.1.2"), 6500)

ne fonctionne pas car il attend le nom d'hôte. Depuis ce document:

host - the host name, or null for the loopback address.
. . .
public Socket(String host,int port) throws UnknownHostException, IOException

Ce que vous devez utiliser est:

new Socket("192.168.1.2", 6500)


4 commentaires

Je suis à peu près sûr que vous analysez les documents plus finement que prévu. Il y a toutes les raisons de s'attendre à ce que Socket (String, int) convertisse la chaîne de nom d'hôte qui lui est présentée en InetAddress via InetAddress.getByName () , exactement comme vous suggérez à l'OP de le faire manuellement.


@ rxn1d - merci mais maintenant, il lance une java.net.ConnectException: connexion refusée pour 192.168.1.1 et java.net.ConnectException: opération expirée pour tout autre hôte de sous-réseau (par exemple 192.168.1.2). modifié mon message pour refléter cela ...


As-tu un pare-feu? Habituellement, le pare-feu bloque toute tentative d'initialisation de la connexion TCP en dehors de l'hôte lui-même. Si vous l'avez sur le serveur, essayez de le désactiver pour ce port spécifique.


@JohnBollinger a tout à fait raison. Vous pouvez spécifier un nom d'hôte ou une adresse IP. Cela fonctionne depuis au moins 23 ans. La réponse n'est pas correcte.



0
votes

Je pense que vous devriez également être conscient de certains outils système pour déboguer au niveau de la boîte noire de votre application afin de déterminer les problèmes possibles:

Je suis une personne Linux, donc je ne connais que les utilitaires Linux:

"sudo netstat -tpln" pour savoir si votre application serveur écoute sur le port souhaité, et surtout, elle doit écouter sur l'IP 0.0.0.0 et pas seulement 127.0.0.1 pour que les ordinateurs du réseau puissent pour s'y connecter.

"sudo iptables -vnL" pour savoir si le pare-feu ne bloque pas les connexions d'origine externe à vos applications serveur. Si tel est le cas, l'application cliente sur le même système où réside votre application serveur pourra communiquer, mais pas la même application cliente sur d'autres systèmes sur le même réseau.

D'après mon expérience, ces débogages aident à résoudre ces problèmes en plus de 90% du temps et ce n'est généralement pas un problème de programmation. J'espère que ces informations vous aideront.


0 commentaires

0
votes

J'ai compris - mon routeur / pare-feu attribue différents ordinateurs à l'intérieur de mon réseau à différentes adresses IP basées sur le sous-réseau mais n'attribuera pas nécessairement le deuxième ordinateur (ultérieurement) à:

191.168.1.2

Ran un ifconfig et découvert l'adresse IP particulière basée sur le sous-réseau qui était 192.168.1.x la valeur réelle de "x" a été omise pour des raisons de sécurité.


1 commentaires

Il n'y a aucune raison de sécurité. Personne ne peut accéder à votre sous-réseau privé.