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.

dans vos tests... à la fois le client et le serveur sont derrière le routeur?
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