当前位置: 首页 > news >正文

【使用java创建TCP连接,让服务端读取200MB的本地文件并发送给客户端,客户端接收文件并保存到本地】

TCP连接发送文件

服务端为java,客户端也为java。(实际场景中客户端和服务端可以为C++)。
使用TCP连接发送文件需要注意:
规定好双方的协议,即发送端要怎么发送,接收端要怎么接收


一、java服务端

publicclassTCPServer{privatestaticfinalintPORT=8081;privatestaticfinalStringFILE_PATH="C:\\Users\\Wasond\\Desktop\\11.zip";// 待发送的 100MB 文件privatestaticfinallongCHUNK_SIZE=1024*1024;// 1MB 分块publicstaticvoidmain(String[]args){// SpringApplication.run(FileServerApplication.class, args);newThread(()->{try(ServerSocketserverSocket=newServerSocket(PORT)){System.out.println("Server started on port "+PORT);while(true){SocketclientSocket=serverSocket.accept();newThread(()->sendFile(clientSocket)).start();}}catch(IOExceptione){e.printStackTrace();}}).start();}privatestaticvoidsendFile(SocketclientSocket){try(java.io.FileInputStreamfileInputStream=newjava.io.FileInputStream(FILE_PATH);DataOutputStreamout=newDataOutputStream(clientSocket.getOutputStream())){longfileSize=newjava.io.File(FILE_PATH).length();out.writeLong(fileSize);// 先发送文件大小(客户端用于进度计算)byte[]buffer=newbyte[(int)CHUNK_SIZE];intbytesRead;longtransferred=0;while(transferred<fileSize){intchunkSize=(int)Math.min(CHUNK_SIZE,fileSize-transferred);bytesRead=fileInputStream.read(buffer,0,chunkSize);if(bytesRead==-1)break;// 文件读取完毕// 发送分块数据out.writeInt(bytesRead);// 发送当前块实际大小out.write(buffer,0,bytesRead);transferred+=bytesRead;}System.out.println("File sent successfully. Total bytes: "+transferred);}catch(IOExceptione){e.printStackTrace();}finally{try{clientSocket.close();}catch(IOExceptione){e.printStackTrace();}}}}

二、java客户端

importjava.io.*;importjava.net.Socket;publicclassTCPClient{privatestaticfinalStringSERVER_HOST="localhost";privatestaticfinalintSERVER_PORT=8081;privatestaticfinalStringOUTPUT_FILE="C:\\Users\\Wasond\\Desktop\\777.zip";publicstaticvoidmain(String[]args){try(Socketsocket=newSocket(SERVER_HOST,SERVER_PORT);DataInputStreamin=newDataInputStream(socket.getInputStream());FileOutputStreamfos=newFileOutputStream(OUTPUT_FILE)){// 1. 读取文件总大小longfileSize=in.readLong();System.out.println("Receiving file (size: "+fileSize+" bytes)");// 2. 分块接收并写入本地文件longreceived=0;while(received<fileSize){intchunkSize=in.readInt();// 读取当前块大小byte[]buffer=newbyte[chunkSize];// in.readFully(buffer); // 确保读取完整块// 替换 in.readFully(buffer) 为更安全的读取方式intbytesRead=0;while(bytesRead<chunkSize){intresult=in.read(buffer,bytesRead,chunkSize-bytesRead);if(result==-1){thrownewIOException("Unexpected end of stream");}bytesRead+=result;}fos.write(buffer);received+=chunkSize;// 打印进度(可选)System.out.printf("Progress: %.2f%%\n",(received*100.0/fileSize));}System.out.println("File received and saved to "+OUTPUT_FILE);}catch(IOExceptione){e.printStackTrace();}}}

http://www.jsqmd.com/news/189332/

相关文章:

  • DeepSeek新工作mHC:一个优化版的残差连接结构
  • Agentic AI技术挑战的冲击,提示工程架构师如何稳住阵脚?
  • IQuest-Coder-V1:国产大模型出现了新玩家
  • Windows 11 LTSC 微软商店一键安装完整指南
  • GitHub加速终极指南:3分钟解决国内开发者访问难题
  • 深度学习计算机毕设之基于ResNet50的植物病害识别研究与系统应用实现
  • 5大核心功能揭秘:Translumo如何成为跨语言沟通的终极利器
  • HunyuanOCR能否用于车牌识别?测试结果显示高准确率
  • c++函数可以返回局部变量的值,但不可以返回局部变量的地址或引用
  • Nrfr终极指南:免Root实现SIM卡国家码精准配置与运营商限制突破
  • 深度学习毕设项目:基于ResNet50的植物病害识别研究与系统应用实现
  • ComfyUI-BrushNet模型配置实战:从零开始到高效使用
  • DL之Titans_MIRAS:在执行时用“惊讶度”驱动记忆写入的长期记忆架构与统一理论框架 —— 从超越 MSE 的 MIRAS 设计空间(包含 YAAD、MONETA、MEMORA 三种注意力自由
  • 出国必备!3分钟搞定手机全球通:Nrfr免Root工具真实体验
  • 虚拟机测试网速的方法
  • AMD显卡也能运行CUDA程序?终极ZLUDA兼容性配置指南
  • VisualGGPK2完全指南:流放之路游戏资源编辑终极解决方案
  • Surya OCR横向评测:数学公式与表格识别能力对比
  • 3个关键步骤让Windows Android子系统继续服务到2027年
  • Onekey Steam清单下载器:免费高效的终极解决方案
  • YimMenu完全配置指南:解锁GTA5终极游戏体验的完整方案
  • 免费终极Windows 10性能优化神器
  • LegalDoc司法文书解析:判决书中当事人信息自动提取
  • 如何快速实现电子书元数据自动化管理:Calibre豆瓣插件完整指南
  • StreamFX插件:免费打造电影级直播效果的完整指南
  • E-commerce商品详情页识别:淘宝京东图片转文字方案
  • 生肖邮票设计大赛:参赛者使用lora-scripts进行初稿创作
  • 【毕业设计】基于ResNet50的植物病害识别研究与系统应用实现
  • 鸣潮120帧极致体验:从卡顿到丝滑的完整指南
  • IDM试用期恢复终极指南:如何继续使用这款下载工具