You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Socket如何从argv[]获取服务端口?遇数组越界及连接问题

问题解决方案

1. 先修复命令行参数导致的数组越界异常

不管用命令行参数还是交互式输入,首先要保证参数获取的合法性,避免数组越界:

服务端(命令行参数版)

// 先校验参数数量,避免数组越界
if (argv.length < 1) {
    System.err.println("用法: java Server <RTSP_PORT>");
    System.exit(1);
}
// 获取RTSP端口
int RTSPport = Integer.parseInt(argv[0]);
server.RTSP_dest_port = RTSPport;

客户端(命令行参数版)

// 校验参数数量,至少需要服务器IP、端口、视频文件名三个参数
if (argv.length < 3) {
    System.err.println("用法: java Client <SERVER_IP> <RTSP_PORT> <VIDEO_FILE>");
    System.exit(1);
}
// 读取参数
int RTSP_server_port = Integer.parseInt(argv[1]);
String ServerHost = argv[0];
theClient.ServerIPAddr = InetAddress.getByName(ServerHost);
VideoFileName = argv[2];

2. 交互式输入(Scanner/BufferedReader)的正确写法

如果不想依赖命令行参数,改用终端输入的话,要确保输入流程有容错,且参数对应正确:

服务端(Scanner版)

Scanner scanner = new Scanner(System.in);
System.out.print("输入RTSP监听端口: ");
// 校验输入是否为合法数字
while (!scanner.hasNextInt()) {
    System.out.print("输入无效,请输入数字端口: ");
    scanner.next(); // 跳过非数字输入
}
int RTSPport = scanner.nextInt();
server.RTSP_dest_port = RTSPport;
scanner.close();

// 启动服务端监听(注意:原代码中accept后立刻关闭listenSocket会直接断开连接,需调整)
try {
    ServerSocket listenSocket = new ServerSocket(RTSPport);
    System.out.println("服务端已启动,等待客户端连接...");
    server.RTSPsocket = listenSocket.accept();
    System.out.println("客户端连接成功: " + server.RTSPsocket.getInetAddress());
    
    // 此处添加RTSP会话处理逻辑
    
    // 会话结束后再关闭连接
    server.RTSPsocket.close();
    listenSocket.close();
} catch (IOException e) {
    System.err.println("服务端启动失败: " + e.getMessage());
    e.printStackTrace();
}

客户端(Scanner版)

Scanner scanner = new Scanner(System.in);

// 获取服务器IP
System.out.print("输入服务器IP地址: ");
String ServerHost = scanner.nextLine().trim();
while (ServerHost.isEmpty()) {
    System.out.print("IP不能为空,请重新输入: ");
    ServerHost = scanner.nextLine().trim();
}

// 获取服务器端口
System.out.print("输入服务器RTSP端口: ");
while (!scanner.hasNextInt()) {
    System.out.print("输入无效,请输入数字端口: ");
    scanner.next();
}
int RTSP_server_port = scanner.nextInt();
scanner.nextLine(); // 清除换行符,避免影响后续输入

// 获取视频文件名
System.out.print("输入请求的视频文件名: ");
String VideoFileName = scanner.nextLine().trim();
while (VideoFileName.isEmpty()) {
    System.out.print("文件名不能为空,请重新输入: ");
    VideoFileName = scanner.nextLine().trim();
}
scanner.close();

// 尝试连接服务器
try {
    theClient.ServerIPAddr = InetAddress.getByName(ServerHost);
    theClient.RTSPsocket = new Socket(theClient.ServerIPAddr, RTSP_server_port);
    System.out.println("已成功连接到服务器");
} catch (IOException e) {
    System.err.println("连接服务器失败: " + e.getMessage());
    e.printStackTrace();
}

3. 客户端无法连接的排查方向

如果参数输入正确但仍无法连接,按以下步骤逐一排查:

  • 端口占用:用netstat -ano | findstr <端口号>(Windows)或lsof -i :<端口号>(Linux/Mac)检查端口是否被其他程序占用,更换未被占用的端口重试。
  • 防火墙限制:确保服务端机器的防火墙允许该端口的TCP入站连接,客户端机器允许出站连接到该端口。
  • IP地址正确性:本地测试用127.0.0.1代替本机IP更可靠;跨机器测试需确认服务器IP为可访问的局域网/公网IP。
  • 服务端连接逻辑错误:原代码中listenSocket.accept()后立刻关闭listenSocket会直接断开连接,需在RTSP会话结束后再关闭Socket。
  • 协议交互问题:即使TCP连接建立,若RTSP消息格式不符合规范(比如客户端请求格式错误、服务端未正确响应),也会导致会话失败,需在代码中添加日志打印RTSP消息内容,排查协议交互细节。

内容的提问来源于stack exchange,提问作者AmBert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 08:22:41