Java Socket编程:获取远程与本地IP及端口信息实例
在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及系统分配的随机端口号。同时,服务端窗口会相应更新为“连接成功……”,证明通信链路已打通且信息获取无误。
注意事项
- 多线程建议:上述服务端代码为简化演示,采用单线程死循环。在实际聊天室开发中,每次
accept()成功后应立即创建新线程处理该Socket的读写,否则无法同时接受多个客户端连接。 - 异常处理:网络操作中极易出现超时或被拒绝连接的情况,务必保留
try-catch块以捕获IOException。 - 端口占用:确保9527端口未被其他程序占用,否则服务端启动时将抛出
BindException。
以上就是Java Socket获取IP和端口方法的详细内容,更多关于Java Socket聊天室开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









