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)
3 Réponses :
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)
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 () code >, 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.
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.
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é.
Il n'y a aucune raison de sécurité. Personne ne peut accéder à votre sous-réseau privé.
«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.