7

チャットプログラムを作成しようとしています。私はコードを書きましたが、すべてが機能しましたが、コンピューターを使用していて、127.0.0.1を使用して接続しているときでも問題なく機能します。また、同じルーターで実行されているラップトップとコンピューターの間の接続にも成功しました。(これを行うために内部IPアドレス10.0.0.3を使用しました)。

現在、自分のルーターと他のルーターを接続しようとしています。そしてこれに私は外部IPアドレスに接続しようとしています。ルーターを介してポート転送部分を実行し、静的IPも作成しました。コードを実行すると、常に「接続拒否エラー」が発生します。

コードは次のとおりです。

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();
    }
  }
}
}

私もこのツールを試しました。MainServerファイルを実行してツールを試すと、肯定的な答えが得られます。私も自分のEclipseでポジティブになります。MainServerが接続に成功すると、次の行を使用してMainServerに関するメッセージを出力します。

Socket socket = server_socket.accept();
System.out.println("server connected to " + socket.getInetAddress());

したがって、上記のツールの[チェック]ボタンをクリックするたびに、Eclipseコンソール(system.out.printlnの部分)に次のメッセージが表示されます。

/69.163.149.200に接続されているサーバー

したがって、問題はおそらくMainServerまたはportforwading/ファイアウォール/静的IPに接続されていないと思います。

また、自分のルーターデバイスから自分のルーターに接続しようとしているために問題が発生するのではないかと思いました。次の30分間はMainServerファイルを開いたままにしておくので、誰かが自分のコンピューターでClient.javaを実行できると便利です。

4

4 に答える 4

4

あなたがやろうとしていることは少し奇妙ですが、それは可能です。

ルーターがNATループバック/NATリフレクションをサポートしているかどうかを確認し、アクティブ化する必要があります。

NATループバック

NATヘアピニングまたはNATリフレクションとも呼ばれます。NATループバックは、多くのコンシューマールーターの機能であり、ユーザーがLANネットワーク内から独自のパブリックIPアドレスに接続できるようにします。これは、(ドメインを含む)WebサイトがそのIPアドレスでホストされている場合に特に便利です。

于 2013-02-12T16:09:13.553 に答える
0

ルーターを適切に構成しないと、これを行うことはできません。ほとんどのルーターは、(デフォルトで)外部(WAN)ポートでの着信接続を許可していません。これを許可する場合は、ルーター構成に入り、使用している特定のポートの外部IPでの接続を許可するように構成する必要があります。次に、その着信接続を外部IPアドレス/ポートから実際のサーバーの内部IPアドレス/ポートにリダイレクトするようにルーターを構成する必要があります。

これは、オンラインゲーマーが自分の家にサーバーをセットアップする方法であることがよくあります。また、外界から自分の内部ネットワークに接続する人の数でもあります。

于 2013-02-12T15:52:40.947 に答える
0

何よりもまず、静的IP(のような192.168.1.6)を内部で設定します。

外部IPを介して接続する場合は、次の2つの方法があります。

  1. ルーターがある場合は、ポート転送を使用します。

  2. ドングルをお持ちの場合は、ポートフォワードする必要はありません。サーバーに直接アクセスできます。ドングルの外部IP(これを見つけるには、このようなwhat's-my-IPサービスを使用します)とポート番号(任意)を指定するだけです。(ドングルはどのISPによってもブロックされません。)

于 2013-06-16T07:46:32.480 に答える
0

内部IPアドレスとサーバー名を/etc/ hostsに追加できます。たとえば、外部IP 10. 10. 123. 123があり、サーバー名YOURCOMPUTER_1.XXX.XXXを使用している場合は、内部に接続します。ネットワーク、あなたは追加することができます:

127.0.0.1YOURCOMPUTER_1.XXX.XXXを/etc/hostsに

于 2015-02-11T23:16:55.347 に答える