------- android培训、java培训、期待与您交流! ----------
客户端
package cn.itcast.b_upload; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; public class Client { public static void main(String[] args) throws IOException { // 1. 控制台获取用户上传的文件的路径. File file = getFile(); System.out.println(file); // 2. 创建客户端Socket. Socket socket = new Socket("192.168.10.1", 5000); // 3. 获取客户端socket 的输入和输出流. InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); // 4. 将客户端文件的名字上传到服务器. out.write(file.getName().getBytes()); // 5. 读取服务端的返回的消息. byte[] buffer = new byte[1024]; int len; len = in.read(buffer); String mess = new String(buffer, 0, len); // 6. 根据服务端的响应,判断文件是否存在. if ("文件存在无需上传".equals(mess)) { System.out.println(mess + ",客户端程序结束!!!"); socket.close(); return; } else { System.out.println(mess); } System.out.println("客户端开始上传!!!"); // 7. 在客户端创建字节输入流. 读取客户端的文件. FileInputStream fis = new FileInputStream(file); // 8. 客户端字节输入流循环读取. while ((len = fis.read(buffer)) != -1) { // 8. 客户端socket 的输出流写出数据. out.write(buffer, 0, len); } // 9. 文件上传完毕,发送结束标记. socket.shutdownOutput(); // 10. 客户端接收服务器的返回的消息. len = in.read(buffer); System.out.println(new String(buffer, 0, len)); // 11. 关闭客户端socket 客户端字节输入流. fis.close(); socket.close(); } public static File getFile() throws IOException { // 1.控制台获取用户需要上传的文件的路径. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while (true) { System.out.println("请输入上传文件的路径:"); String filePath = br.readLine(); File file = new File(filePath); // 2.路径不存在. if (!file.exists()) { System.out.println("路径不存在,请重新输入. "); continue; } // 2. 不支持目录. if (file.isDirectory()) { System.out.println("暂不支持目录上传,等待升级版!!!"); continue; } return file; } } }
服务器
package cn.itcast.b_upload; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { // 1. 创建服务端. System.out.println("tcp 服务器启动.准备接收文件"); ServerSocket server = new ServerSocket(5000); while (true) { // 2. accept 方法等待客户端连接. final Socket socket = server.accept(); new Thread(new Runnable() { @Override public void run() { String ip = socket.getInetAddress().getHostAddress(); System.out.println("客户端:" + ip + "连接了.."); try { // 3. 获取服务端socket 的输入和输出流. InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); byte[] buffer = new byte[1024 * 8]; int len; // 4. 服务接收文件的名字. len = in.read(buffer); String fileName = new String(buffer, 0, len); // 5. 在服务器明确该文件保存的路径... File dir = new File("e:\\upload"); // 检测该目录是否存在. 如果不存在,必须创建. if (!dir.exists()) { dir.mkdir(); } // 6. 根据客户端上传的文件名,封装为一个File 对象. File file = new File(dir, fileName); // 7. 服务器, 检测文件是否存在. 如果存在就不再重复上传. if (file.exists()) { out.write("文件存在无需上传".getBytes()); socket.close(); return; } else { out.write("文件不存在可以上传".getBytes()); } System.out.println("服务端开始接收"); // 8. 服务器创建本地的字节输出流. 将socket 读取的数据持久化存储到服务器. FileOutputStream fos = new FileOutputStream(file); // 9. 服务器开始接收. while ((len = in.read(buffer)) != -1) { fos.write(buffer, 0, len); } System.out.println("服务器接收完毕!!!"); // 10. 服务器接收完毕,想客户端发送结束的消息. out.write("服务器成功接收完毕".getBytes()); // 11. 关闭服务端的创建的字节输出流. fos.close(); } catch (IOException e) { // e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { // e.printStackTrace(); } System.out.println("客户端:" + ip + "离开了.."); } } }).start(); } } }
相关推荐
在Java编程语言中,类加载器(ClassLoader)是至关重要的组成部分,它负责将类的字节码从磁盘、网络或其他存储介质加载到JVM(Java虚拟机)中,并将其转换为可执行的Java对象。类加载器的学习是深入理解Java运行机制...
- JavaBean可以实现`Serializable`接口,使其支持数据持久化,方便在内存、文件或网络间传输。 4. **属性访问**: - JavaBean可以通过`PropertyUtils`或`BeanUtils`类(来自Apache Commons BeanUtils库)进行便捷...
在本视频教程“黑马程序员_毕向东_Java基础视频教程第22天-06-GUI(Action事件)”中,讲师毕向东深入讲解了Java GUI中的Action事件处理机制,这是构建用户友好界面的关键部分。 首先,我们要理解什么是GUI。GUI,...
这个名为“黑马程序员_毕向东_Java基础源码.rar”的压缩包文件,包含了丰富的Java基础源代码实例,对于初学者来说,是深入了解Java编程的良好资源。 一、Java基本语法 Java语言以其严格的类型检查和面向对象特性...
《黑马程序员_从零开始征服Android之旅(第二季)源码和笔记(上)》是一部针对初学者的全面Android开发教程,旨在帮助学员系统地掌握Android应用开发的基础知识和实战技巧。通过本教程的学习,你可以从理论出发,...
在本课程中,“黑马程序员”将引导我们逐步学习如何在短短两小时内编写一个Android应用程序。这个教程特别关注的是第5天的内容,主要涉及到天气预报应用的开发,包括数据获取、数据显示以及网络图片的查看功能。下面...
- **简单的网页爬虫**:运用多线程技术并结合网络编程知识,实现网页数据的抓取和解析。 ### 学习资源推荐 - **官方文档**:Oracle官网提供了详尽的Java SE教程和API文档。 - **在线课程**:如黑马程序员提供的...
在"黑马程序员_Java基础辅导班教程课件[第01期]第10天"中,我们聚焦于Java编程语言的基础知识,这是一门面向初学者的课程,旨在帮助学员快速掌握Java的核心概念。通过这个阶段的学习,学员将能够理解并运用Java的...
5. **网络编程**:学习如何使用socket库进行网络通信,实现客户端和服务器程序。 6. **并发编程**:了解线程(threading模块)和进程(multiprocessing模块)的概念,以及如何在Python中实现并发。 7. **装饰器**...
8. **第7阶段-C++实战项目机房预约资料**:最后的实战项目可能涉及数据库连接、网络编程或其他高级主题,帮助学习者在实践中运用所学知识,解决实际问题。 通过这个全面的学习路径,从零开始的C++学习者可以逐步...
【标题】"黑马程序员安卓 笔记代码(包含源码) 第76期" 提供的是安卓开发的相关学习资料,其中包含了源码,这通常意味着我们可以深入理解代码的实现细节和设计思路。作为第76期,这可能是一个长期系列教程的一部分...
### 安卓黑马程序员课程知识点概览 #### 1. XML编程 - **知识点概述**:XML编程是学习安卓开发的基础之一,通过本课程学员将掌握XML的基本语法、元素及属性定义、命名空间等概念。 - **教师**:王昭珽 - **教学目标...
用代码实现List和map存储、取出数据使用泛型 使用泛型可以确保类型安全性,避免ClassCastException等类型转换异常。 #### 53. 将用户输入在控制台上的指定路径下所有的.txt文件复制到c盘下随意目录(你可以自己...
根据提供的文件信息,这里将对“黑马程序员最新一期高清教学视频”进行详细的解析与扩展,以便更好地理解其中可能涵盖的知识点和技术内容。 ### 黑马程序员教学视频概述 #### 标题解读:“黑马程序员最新一期高清...
### 黑马程序员Android视频教程知识点解析 #### 一、Android基础概述 - **定义与特点**:Android是一种基于Linux内核(不包括GNU组件)的开源操作系统,主要用于移动设备。它由Google公司及其领导下的开放手机联盟...
除了基本的GUI功能,Qt还包含一系列高级特性,如网络编程、数据库访问、多媒体支持、XML处理、并发编程等。这些功能使得Qt不仅仅是一个GUI库,而是能处理各种复杂应用的全能工具。 在"黑马Qt讲义文件"中,我们可以...
《2018黑马程序员前端36期全套视频教程》是一部综合性的前端开发学习资源,旨在帮助初学者和有一定基础的开发者系统提升前端技能。该教程涵盖了Web开发的基础到高级内容,结合就业班的实战项目,旨在培养学员的实战...
《黑马程序员Java面试宝典》是一本专门为Java开发者准备的面试指南,包含了广泛而深入的Java技术知识,以及面试过程中可能会遇到的各种问题。这本书的完整版PDF提供了丰富的学习材料,帮助求职者提升自己的技术水平...
【标题】:“黑马程序员.NET入学测试题”是一个针对.NET学习者设计的测试集,旨在评估学员对.NET框架的理解和应用能力。这个测试可能包括了基础语法、类库使用、面向对象编程、数据库交互等多个方面的内容。 【描述...