Java Socket编程:获取远程与本地IP及端口信息实例

花开有时
花开有时
发布时间:2026-10-15 | 4人浏览过
原创

在Java聊天室或即时通讯应用中,实时掌握通信双方的IP地址和端口号是基础且关键的需求。本文将通过完整的代码示例,详细讲解如何利用ServerSocket实现服务端监听,以及如何利用Socket对象的方法(如 getInetAddress() 和 getPort())准确提取远程服务器的地址信息与本地客户端的网络参数。

解题思路与核心方法

要实现获取IP和端口功能,需构建服务端与客户端两个独立程序。服务端通过 ServerSocket 指定端口等待接入;客户端通过 Socket 主动连接目标主机。连接建立后,可通过以下核心API提取信息:

  • 远程服务器地址:socket.getInetAddress().getHostAddress(),返回远程主机的IP字符串。
  • 远程服务器端口:socket.getPort(),返回连接的远程端口号。
  • 本地客户端地址:socket.getLocalAddress().getHostAddress(),返回发起连接的本地IP。
  • 本地客户端端口:socket.getLocalPort(),返回系统分配给该连接的本地临时端口。

服务端实现:ServerSocketFrame

服务端类继承自 JFrame,用于提供图形界面显示连接状态。其核心逻辑是通过 getserver() 方法创建监听套接字并阻塞等待客户端连接。

第1步:创建服务端窗口

初始化UI组件,包含一个文本区域 ta_info 用于输出日志信息,并将其实例化以便在主程序中调用。

package com.xiaoxuzhu;
import java.awt.BorderLayout;
import java.net.*;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class ServerSocketFrame extends JFrame {
    private JTextArea ta_info;
    private ServerSocket server; 
    private Socket socket;

    public void getserver() {
        try {
            // 实例化ServerSocket,监听9527端口
            server = new ServerSocket(9527); 
            ta_info.append("服务器套接字已经创建成功\n");
            // 死循环等待客户端连接
            while (true) { 
                ta_info.append("等待客户机的连接......\n"); 
                // accept()方法会阻塞,直到有客户端连接
                socket = server.accept(); 
                ta_info.append("连接成功......\n");
                // 注:实际应用中此处应开启新线程处理通信,避免阻塞后续连接
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ServerSocketFrame frame = new ServerSocketFrame();
        frame.setVisible(true);
        frame.getserver();
    }

    public ServerSocketFrame() {
        super();
        setTitle("服务器端程序");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 336, 257);
        final JScrollPane scrollPane = new JScrollPane();
        getContentPane().add(scrollPane, BorderLayout.CENTER);
        ta_info = new JTextArea();
        scrollPane.setViewportView(ta_info);
    }
}

客户端实现:ClientSocketFrame

客户端类同样继承 JFrame,核心在于 connect() 方法。该方法尝试连接本地回环地址(127.0.0.1)的9527端口,成功后立即打印四元组信息。

第2步:配置并建立Socket连接

在构造器中完成UI布局,并通过 connect() 方法发起TCP握手。连接建立后,直接调用相关方法提取地址并追加至文本域展示。

package com.xiaoxuzhu;
import java.awt.BorderLayout;
import java.net.*;
import javax.swing.*;
import javax.swing.JScrollPane;

public class ClientSocketFrame extends JFrame {
    private Socket socket; 
    private JTextArea ta = new JTextArea();

    public ClientSocketFrame() {
        super();
        setTitle("获取Socket信息");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 351, 257);
        final JScrollPane scrollPane = new JScrollPane();
        getContentPane().add(scrollPane, BorderLayout.CENTER);
        scrollPane.setViewportView(ta);
    }

    private void connect() {
        ta.append("尝试连接......\n");
        try {
            // 连接本地9527端口
            socket = new Socket("127.0.0.1", 9527); 
            ta.append("完成连接。\n");
            
            // 获取远程服务器IP和端口
            InetAddress netAddress = socket.getInetAddress();
            String netIp = netAddress.getHostAddress();
            int netPort = socket.getPort();
            
            // 获取本地客户端IP和端口
            InetAddress localAddress = socket.getLocalAddress();
            String localIp = localAddress.getHostAddress();
            int localPort = socket.getLocalPort();
            
            ta.append("远程服务器的IP地址:" + netIp + "\n");
            ta.append("远程服务器的端口号:" + netPort + "\n");
            ta.append("客户机本地的IP地址:" + localIp + "\n");
            ta.append("客户机本地的端口号:" + localPort + "\n");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ClientSocketFrame clien = new ClientSocketFrame();
        clien.setVisible(true);
        clien.connect();
    }
}

运行结果与验证

首先启动服务端程序,控制台/窗口将显示“服务器套接字已经创建成功”及“等待客户机的连接”,表明服务已在后台就绪。

随后启动客户端程序,客户端窗口会在短时间内弹出提示“完成连接”,并自动列出四行详细信息:包括远程连接的IP(通常为127.0.0.1)、远程端口(9527)、本机IP及系统分配的随机端口号。同时,服务端窗口会相应更新为“连接成功……”,证明通信链路已打通且信息获取无误。

注意事项

  1. 多线程建议:上述服务端代码为简化演示,采用单线程死循环。在实际聊天室开发中,每次 accept() 成功后应立即创建新线程处理该 Socket 的读写,否则无法同时接受多个客户端连接。
  2. 异常处理:网络操作中极易出现超时或被拒绝连接的情况,务必保留 try-catch 块以捕获 IOException。
  3. 端口占用:确保9527端口未被其他程序占用,否则服务端启动时将抛出 BindException。

以上就是Java Socket获取IP和端口方法的详细内容,更多关于Java Socket聊天室开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表