Effectuer une connexion en utilisant une adresse IP externe en Java
Je suis en train de construire un programme de chat. J'ai écrit le code et tout a fonctionné et fonctionne encore très bien quand je suis à l'aide de mon ordinateur et de la connexion à l'aide de l'adresse 127.0.0.1. J'ai aussi réussi à se connecter avec succès entre mon portable et mon ordinateur, qui s'exécutent sur le même routeur. (J'ai utilisé une adresse IP interne pour ce faire, 10.0.0.3).
Maintenant, je vais essayer de faire un lien entre mon routeur et les autres routeurs. Et pour cela, je suis en train d'essayer de se connecter à une adresse IP externe. Je fais la redirection de port partie grâce à mon routeur et j'ai également une adresse IP statique. Lorsque j'exécute le code, je reçois toujours une "connexion refusée erreur".
Voici le code:
MainServer.java:
import java.util.*;
import java.io.*;
import java.net.*;
public class MainServer {
private ArrayList<Socket> sockets;
public MainServer() {
ServerSocket server_socket;
try {
server_socket = new ServerSocket(5005);
sockets = new ArrayList<Socket>();
System.out.println("server is now running");
while(true) {
Socket socket = server_socket.accept();
sockets.add(socket);
try {
PrintWriter writer = new PrintWriter(socket.getOutputStream());
writer.println("---you are connected to the server---\r\n");
writer.flush();
} catch(Exception e) {e.printStackTrace();}
System.out.println("server connected to " + socket.getInetAddress());
Reader reader = new Reader(socket);
Thread thread = new Thread(reader);
thread.start();
}
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
MainServer server = new MainServer();
}
class Reader implements Runnable {
Socket socket;
public Reader(Socket socket) {
this.socket=socket;
}
public void run() {
while(true) {
try {
InputStreamReader stream_reader = new InputStreamReader(socket.getInputStream());
BufferedReader reader = new BufferedReader(stream_reader);
while(true) {
String str = reader.readLine();
if(str==null)
continue;
System.out.println("message from the client " + socket.getInetAddress() + ": " + str);
send_back_message(str);
}
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void send_back_message(String str) {
try {
for(Socket send_to_socket: sockets) {
PrintWriter writer = new PrintWriter(send_to_socket.getOutputStream());
writer.println(send_to_socket.getInetAddress()+ ": " + str);
writer.flush();
}
} catch(Exception e) {e.printStackTrace();}
}
}
}
Client.java:
public Client() {
frame = new JFrame();
JPanel panel = new JPanel();
chat = new JTextArea(20,40);
chat.setEditable(false);
JScrollPane scroll = new JScrollPane(chat);
text = new JTextField(32);
JButton send = new JButton("Send");
send.addActionListener(new SendButtonListener());
panel.add(scroll);
panel.add(text);
panel.add(send);
frame.getContentPane().add(panel);
frame.setSize(500,500);
frame.setVisible(true);
try {
socket = new Socket("77.126.189.65",5005);
} catch (Exception e) {
e.printStackTrace();
}
Thread thread = new Thread(new ClientReader());
thread.start();
}
public static void main(String[] args) {
Client client = new Client();
}
class SendButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
try {
PrintWriter writer = new PrintWriter(socket.getOutputStream());
writer.println(text.getText());
writer.flush();
text.setText("");
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
class ClientReader implements Runnable {
public void run() {
try {
InputStreamReader stream_reader = new InputStreamReader(socket.getInputStream());
BufferedReader reader = new BufferedReader(stream_reader);
while(true) {
String str = reader.readLine();
if(str==null)
continue;
chat.setText(chat.getText() + str + "\r\n" );
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
J'ai aussi essayé cet outil. Quand je lance le MainServer fichier et essayez de l'outil, je reçois une réponse positive. J'ai aussi positif sur mon propre Eclipse. Quand mon MainServer rend une connexion réussie, il imprime un message à ce sujet à l'aide de ces lignes:
Socket socket = server_socket.accept();
System.out.println("server connected to " + socket.getInetAddress());
Donc à chaque fois que je suis en cliquant sur le bouton "rechercher" dans l'outil ci-dessus, je reçois un message dans ma Éclipse de la console système..println partie):
serveur connecté à /69.163.149.200
Donc je pense que le problème n'est probablement pas connecté à la MainServer ou la portforwading/pare-feu/IP statique.
J'ai aussi pensé que peut-être le problème se produit parce que j'essaie de connecter à partir de mon propre routeur périphérique à mon propre routeur. Je vais laisser le MainServer d'ouverture de fichier pour la prochaine demi-heure, donc si quelqu'un peut exécuter l'Client.java sur son ordinateur, il sera utile.
oui je lance le serveur et le client sur la même éclipse même ordinateur et le même routeur
Si vous êtes toujours à l'intérieur de LAN (que je comprends), vous devez utiliser l'adresse IP interne. Si vous êtes sur le même ordinateur, vous devez utiliser 127.0.0.1
je n'ai pas vraiment comprendre ce que le LAN. j'ai déjà utilisé ip interne et cela a fonctionné. le point principal du programme est de connecter entre diffrent routeurs, donc j'utilise extenal ip. j'ai essayer de faire un lien sur mon propre ordinateur pour vérifier si le programme de travail lorsque j'utilise l'ip externe.
OriginalL'auteur Shelef | 2013-02-12
Vous devez vous connecter pour publier un commentaire.
Ce que vous essayez de faire est un peu bizarre, mais c'est possible.
Vous avez juste besoin de savoir si votre routeur prend en charge NAT Loopback /NAT Réflexion et de l'activer.
Heureux de vous aider 😉
par la façon dont comment puis-je l'acheter ou obtenir gratuitement un serveur qui peut exécuter des fichiers java. (je cherche quelque chose de similaire, l'hébergement de site web)
désolé... je ne sais pas... j'ai fait une recherche rapide dans google un millier est apparu, mais j'ai pas d'expérience dans l'hébergement java =(
OriginalL'auteur Davide Berra
Vous ne serez pas en mesure de le faire sans que la configuration de votre routeur de façon appropriée. La plupart des routeurs ne permettent pas (par défaut) les connexions entrantes sur leurs externe (WAN) port. Si vous souhaitez autoriser cela, vous aurez besoin d'aller dans la configuration de votre routeur et le configurer pour autoriser les connexions sur l'IP externe pour le port que vous utilisez. Ensuite, vous devez configurer le routeur pour rediriger cette connexion entrante à partir de l'adresse IP externe/port à l'adresse IP interne/port de votre serveur.
C'est souvent la façon dont les joueurs en ligne mise en place de serveurs dans leur propre maison. C'est aussi la façon dont beaucoup de gens se connecter à leur propre réseau interne du monde extérieur.
Et vous n'avez pas de pare-feu en cours d'exécution sur le serveur?
je ne pense pas ainsi. mon port est ouvert selon cet outil: yougetsignal.com/tools/open-ports
pouvez-vous essayer d'exécuter le Client.java fichier sur votre propre ordinateur et je sais que si il peut se connecter (mon serveur ouvert)
Les gens ne devraient pas être demander à des inconnus de se connecter à leur intérieur des machines de ce genre. En proie à des problèmes de sécurité.
OriginalL'auteur mightyrick
Avant toute chose, définissez une adresse IP statique (comme
192.168.1.6
) en interne.Si youu souhaitez vous connecter via une adresse IP externe, il y a deux façons:
Si vous avez un routeur, l'utilisation de la redirection de port.
Si vous avez un dongle, pas besoin de redirection de port; vous pouvez directement accéder au serveur. Juste donner la clé de protection IP externe (pour les trouver, utilisez un ce de-mon-IP service comme cette une) et un numéro de port (tout). (Dongles ne sont pas bloqués par les fournisseurs d'accès à internet.)
OriginalL'auteur SID SHARMA
Vous pouvez ajouter votre adresse IP interne avec le nom de votre serveur dans /etc/hosts, par exemple, si vous avez une IP externe 10. 10. 123. 123, et avec le nom du serveur YOURCOMPUTER_1.XXX.XXX, vous souhaitez vous connecter à l'intérieur du réseau, vous pouvez ajouter:
127.0.0.1 YOURCOMPUTER_1.XXX.XXX à votre /etc/hosts
OriginalL'auteur yclod