TCP客户端-服务端程序中服务端FileDownload代码块重复执行问题排查求助
问题分析与修复方案
看起来你遇到的核心问题是客户端重复发送了FileDownload指令,导致服务端对应的代码块执行了两次。让我帮你拆解一下问题根源,再给出修复方案:
问题根源:客户端重复发送请求
看你的客户端主循环代码:
while(true) { String msg="", received=""; String length; msg = sc.nextLine(); pw.println(msg); // 第一次发送请求 if(msg.equals("END")) break; if(poraka.equals("Hello")) { // 这里还有个笔误:poraka应该是msg // ... Hello逻辑处理 } else if(msg.contains("FileDownload")) { System.out.println("FileDownload-Start"); pw.println(msg); // 第二次重复发送了相同的请求! // ... 后续下载逻辑 } }
你在循环开头已经通过pw.println(msg)发送了一次FileDownload指令,但在分支内部又再次调用了pw.println(msg),等于给服务端发了两次一模一样的请求。服务端的while(true)循环会连续读取到这两次请求,自然会执行两次FileDownload的处理逻辑,导致重复发送文件数据。
修复步骤
- 删除重复的发送语句:直接删掉
else if(msg.contains("FileDownload"))分支里的pw.println(msg),只保留循环开头的那一次发送即可。 - 修正笔误:把
poraka.equals("Hello")改成msg.equals("Hello"),否则Hello分支永远不会被触发。 - 完善文件读写逻辑:当前代码只读取一次1024字节,大文件会丢失内容,建议循环读取直到文件结束;同时记得关闭IO流避免资源泄漏。
修复后的客户端核心代码片段
else if(msg.contains("FileDownload")) { System.out.println("FileDownload-Start"); byte[] b=new byte[1024]; File file=new File(reader.readLine().trim()); System.out.println(file.getName().trim()); FileOutputStream fo=new FileOutputStream("D:\\Eclipse WorkSpace\\proekt\\src\\client\\"+file.getName().trim()); System.out.println("file: "+file.getName().trim()); // 循环读取完整文件内容 int bytesRead; while ((bytesRead = in.read(b)) != -1) { fo.write(b, 0, bytesRead); } fo.close(); // 关闭输出流 System.out.println("FileDownload-End"); }
服务端的小优化建议
服务端读取文件时也存在同样的不完整问题,建议修改为循环读取:
if(j>0 && j<s.length) { FileInputStream fi=new FileInputStream(s[j]); byte[] b=new byte[1024]; System.out.println("file: "+s[j]); pw.println(s[j]); // 循环发送完整文件 int bytesRead; while ((bytesRead = fi.read(b)) != -1) { out.write(b, 0, bytesRead); } fi.close(); // 关闭输入流 System.out.println("FileDownload-End"); }
内容的提问来源于stack exchange,提问作者Viktor Dimitrioski
相关产品推荐
相关产品推荐

