Java网络编程:Socket 通信:文件上传
import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /** * @program: FirstDemo * @description: javaScoket网络编程:文件上传下载 * @author: GuoTong * @create: 2020-08-25 18:05 **/ public class ImageSocketServer { //服务端 public static void main(String[] args) { System.out.println("文件上传服务端....."); //服务端 ServerSocket serverSocket = null; Socket socket = null; BufferedInputStream inputStream = null; BufferedOutputStream outputStream = null; try { //1.创建服务端 serverSocket = new ServerSocket(6666); //2.建立连接 socket = serverSocket.accept(); //通过接收客户端数据,输入流的方式 inputStream = new BufferedInputStream(socket.getInputStream()); //创建输出流保存到本地 outputStream = new BufferedOutputStream(new FileOutputStream("copy.jpg")); //读数据 byte[] bytes = new byte[1024 * 8]; int len; while ((len = inputStream.read(bytes)) != -1) { outputStream.write(bytes, 0, len); } System.out.println("文件上传复制完毕"); } catch (IOException e) { e.printStackTrace(); } finally { try { if (outputStream != null) { outputStream.close(); } if (inputStream != null) { inputStream.close(); } if (socket != null) { socket.close(); } } catch (IOException e) { e.printStackTrace(); } } } } class ImageSocketClient{ //客户端 public static void main(String[] args) { Socket socket=null; BufferedInputStream inputStream = null; BufferedOutputStream outputStream = null; try { socket=new Socket(InetAddress.getByName("127.0.0.1"),6666); // 创建输入流,读取本地文件 inputStream = new BufferedInputStream(new FileInputStream("./src/a123.jpg")); //传递文件给服务器 outputStream = new BufferedOutputStream(socket.getOutputStream()); //.写数据 byte[] bytes = new byte[1024 * 8]; int len; while ((len=inputStream.read(bytes))!=-1){ outputStream.write(bytes,0,len); outputStream.flush();//清空 } System.out.println("文件发送完毕。。。"); } catch (IOException e) { e.printStackTrace(); } finally { try { if (outputStream!=null) outputStream.close(); if (inputStream!=null) inputStream.close(); if (socket!=null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
优化:回写实现,循环接收的问题
public class FileUpload_Server { public static void main(String[] args) throws IOException { System.out.println("服务器 启动..... "); // 1. 创建服务端ServerSocket ServerSocket serverSocket = new ServerSocket(6666); // 2. 循环接收,建立连接 while (true) { Socket accept = serverSocket.accept(); /* 3. socket对象交给子线程处理,进行读写操作 Runnable接口中,只有一个run方法,使用lambda表达式简化格式 */ new Thread(new Runnable { try ( //3.1 获取输入流对象 BufferedInputStream bis = new BufferedInputStream(accept.getInputStream()); //3.2 创建输出流对象, 保存到本地 . FileOutputStream fis = new FileOutputStream(System.currentTimeMillis() + ".jpg"); BufferedOutputStream bos = new BufferedOutputStream(fis); ) { // 3.3 读写数据 byte[] b = new byte[1024 * 8]; int len; while ((len = bis.read(b)) != -1) { bos.write(b, 0, len); } // 4.=======信息回写=========================== System.out.println("back ........"); OutputStream out = accept.getOutputStream(); out.write("上传成功".getBytes()); out.close(); //================================ //5. 关闭 资源 bos.close(); bis.close(); accept.close(); System.out.println("文件上传已保存"); } catch (IOException e) { e.printStackTrace(); } }).start(); } } }
public class FileUpload_Client { public static void main(String[] args) throws IOException { // 1.创建流对象 // 1.1 创建输入流,读取本地文件 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.jpg")); // 1.2 创建输出流,写到服务端 Socket socket = new Socket("localhost", 6666); BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); //2.写出数据. byte[] b = new byte[1024 * 8 ]; int len ; while (( len = bis.read(b))!=-1) { bos.write(b, 0, len); } // 关闭输出流,通知服务端,写出数据完毕 socket.shutdownOutput(); System.out.println("文件发送完毕"); // 3. =====解析回写============ InputStream in = socket.getInputStream(); byte[] back = new byte[20]; in.read(back); System.out.println(new String(back)); in.close(); // ============================ // 4.释放资源 socket.close(); bis.close(); } }
作者:隔壁老郭
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
Java入门到入坟
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南