当前位置: 首页 > 知识库问答 >
问题:

使用Java中的外部IP地址建立连接

薄伟彦
2023-03-14

我正在尝试建立一个聊天程序。我写了代码,一切都工作了,当我使用我的电脑和使用127.0.0.1连接时,仍然工作得很好。我还成功地在我的笔记本电脑和运行在同一路由器上的电脑之间成功连接。(我使用内部IP地址做到这一点,10.0.0.3)。

现在我正在尝试在我的路由器和其他路由器之间建立连接。为此,我试图连接到外部IP地址。我通过路由器做端口转发部分,我还做了一个静态IP。当我运行代码时,我总是得到一个“连接拒绝错误”。

下面是代码:

主要erver.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文件并尝试该工具时,我得到了肯定的答案。我对自己的日食也有积极的评价。当我的MainServer成功连接时,它会使用以下行打印一条关于它的消息:

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

因此,每次我在上面的工具中单击“check”按钮时,我都会在Eclipse控制台(system.out.println部分)中收到一条消息:

服务器已连接到/69.163.149.200

因此,我认为问题可能与主服务器或涉水/防火墙/静态IP端口无关。

我还认为问题可能是因为我正在尝试从我自己的路由器设备连接到我自己的路由器。我会让MainServer文件在接下来的半小时内保持打开状态,以便有人可以运行客户端。在他的计算机上使用java,这会很有帮助。

共有3个答案

郭永怡
2023-03-14

首先,在内部设置一个静态IP(如192.168.1.6)。

如果您想通过外部IP连接,有两种方式:

>

如果你有一个加密狗,不需要端口转发;您可以直接访问服务器。只需提供加密狗的外部IP(要找到它,请使用像这样的what-s-my-IP服务)和端口号(任意)。(加密狗不被任何ISP阻止。)

秋光熙
2023-03-14

如果不正确配置路由器,您将无法执行此操作。大多数路由器不允许(默认情况下)在其外部(WAN)端口上进行传入连接。如果您想允许这样做,您需要进入路由器配置,并将其配置为允许您正在使用的特定端口在外部IP上进行连接。然后,您必须配置路由器以将传入连接从外部IP地址/端口重定向到实际服务器的内部IP地址/端口。

这通常是在线游戏玩家在自己家里设置服务器的方式。也是有多少人从外界连接到自己的内部网络。

纪俊良
2023-03-14

你想做的事情有点奇怪,但这是可能的。

你只需要知道你的路由器是否支持NAT环回/NAT反射并激活它。

NAT环回

也称为NAT发夹或NAT反射。NAT环回是许多消费者路由器的一个功能,它允许用户从局域网内连接到自己的公共IP地址。当一个网站(带有域名)托管在该IP地址时,这尤其有用。

 类似资料:
  • 问题内容: 我不太确定如何获取计算机的外部IP地址,就像网络外部的计算机会看到它一样。 我下面的IPAddress类仅获取计算机的本地IP地址。 问题答案: 我不确定是否可以从在本地计算机上运行的代码中获取该IP。 但是,你可以构建在网站上运行的代码(例如在JSP中运行),然后使用返回请求来源IP的内容: 或者只是使用已经存在的服务来执行此操作,然后解析该服务的答案以找出IP。 使用AWS等Web

  • 我正在将minikube作为docker映像运行。我试图使用Nodeport将我的服务公开给外部世界。 这是我的yaml文件。 搜索了大量关于nodePort的信息,我们需要节点ip才能访问该服务。我可以使用minikube service docker hello world svc访问我的服务——url,它为我提供了访问服务的urlhttp://127.0.0.1:52526但此处的端口号与n

  • 问题内容: 寻找一种使计算机具有当前外部IP的更好方法…可以正常工作,但宁愿不依赖外部站点来收集信息…我只能使用与Mac OS捆绑在一起的标准Python 2.5.1库X 10.5.x 问题答案: 如果您在获得外部IP的路由器后面,恐怕您别无选择,只能像您一样使用外部服务。如果路由器本身具有某些查询接口,则可以使用它,但是该解决方案将针对特定环境且不可靠。

  • 问题内容: 我正在使用node.js,需要获取由ISP提供的外部IP地址。有没有一种方法可以不使用http://myexternalip.com/raw之类的服务来实现? 问题答案: 使用包装 https://github.com/alsotang/externalip

  • 当我尝试连接本地集群时 这很好用。但是通过连接到外部地址,我如何接收 我如何设置HazelcastClient连接IP? 我已经看过Hazelcast:连接到远程集群,但我找不到如何以编程方式使其

  • 我希望在连接到wifi网络时,在运行我的应用程序的手机上获取用户的本地IPv4地址。使用以下代码: 我可以得到一些接近IPv4地址的信息,但与命令行中的IPv4地址相比,它并不完全相同。有更好的办法吗?我知道formatIpAddress已被弃用,但在我找到获取IPv4地址的方法之前,我暂时不太担心这个问题。 编辑: 我发现手机wifi设置中的ip地址是我在使用建议的解决方案获取ip地址时得到的。