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
相关产品推荐
相关产品推荐

