查看本章节

查看作业目录


需求说明:

实现客户端向服务端上传文件的功能

当启动服务端后,运行客户端程序,系统提示客户在客户端输入上传文件的完整路径。当客户在客户端输入完成后,服务端实现文件上传

实现思路:

  1. 创建客户端类 FileClient 和服务端类 FileServer
  2. 在客户端类中定义uploadFile(Socket socket)方法,用于上传文件,使用BufferedOutputStream包装socket中输入流对象,使用new FileInputStream输入流对象读取本地文件,使用输出流将文件利用socket管道将数据循环发送至服务端
  3. 在客户端FileCliet类中,使用new Socket连接本地服务端和端口,调用uploadFile方法实现文件上传
  4. 在服务端类FileServer中,定义downFile()方法用于下载文件,该方法中使用BufferedInputStream包装socket中的输入流读取文件内容,并且使用FileOutputStream写到本地
  5. 分别运行服务端和客户端程序进行测试

实现代码:

服务端类 FileServer

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket; public class FileServer {
public ServerSocket server;
public Socket socket; public void downloadFile() {
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
// 获取Socket管道字节输入流
InputStream in = socket.getInputStream();
// 将Socket管道字节输入流,进行缓冲包装提高读取的速度
bis = new BufferedInputStream(in);
// 读取客户端发送的文件名
int length = bis.read();
byte[] b = new byte[length];
bis.read(b);
// 获取需要下载的文件名
String fileName = this.getFileName(new String(b));
// 下载的文件对象
FileOutputStream fos = new FileOutputStream("H://" + this.getFileName(fileName));
// 对FileOutputStream进行缓冲包装,提高写入的速度
bos = new BufferedOutputStream(fos);
// 创建临时变量保存数据
int data = 0;
// 写入文件
while ((data = bis.read()) != -1) {
bos.write(data);
}
System.out.println("客户/" + socket.getInetAddress() + ":上传文件[" + fileName + "]成功");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bis != null) {
bis.close();
}
if (bos != null) {
bos.close();
}
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} // 对文件的全路径进行拆分,返回文件名
private String getFileName(String fn) {
String[] files = fn.split("/");
return files[files.length - 1];
} // 创建服务器
public void crateServer() {
try {
// 创建Socket实例
server = new ServerSocket(8888);
// 创建while循环接受多个客户端的连接
while (true) {
// 每一个连接的客户端都与服务器维护一条专属的Socket通信管道
socket = server.accept();
System.out.println("客户端已经连接");
downloadFile();
break;
}
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
new FileServer().crateServer();
}
}

客户端类 FileClient

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
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 FileClient {
// 向服务器发送数据
public void uploadFile(Socket socket) {
BufferedReader reader = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
System.out.println("请输入要上传文件的完成路径:");
// 接收键盘输入
InputStream in = System.in;
// 获取Socket管道字节输出流
OutputStream out = socket.getOutputStream();
// 使用BufferedReader包装,便于按行读取客户端输入的数据
reader = new BufferedReader(new InputStreamReader(in));
// 客户端上传到服务端文件的名字
String fileName = reader.readLine();
// 创建字符文件输入流,用于读取上传文件中的数据
FileInputStream fis = new FileInputStream(fileName);
// 使用字节输入缓冲提高读取的速度
bis = new BufferedInputStream(fis);
// 获取Socket管道输出流,将从文件中的数据写入到管道中
bos = new BufferedOutputStream(out);
byte[] nbt = fileName.getBytes();
// 将文件名字符串转换成字节数组的长度写入到Socket管道中
bos.write(nbt.length);
// 将字节数组写入到Socket管道中
bos.write(nbt);
// 定义临时变量,将从文件中读取到的数据写入到Socket管道中
int data = 0;
// 将文件中的数据写入到Socket管道中
while ((data = bis.read()) != -1) {
bos.write(data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭io流和socket
try {
if (reader != null) {
reader.close();
}
if (bis != null) {
bis.close();
}
if (bos != null) {
bos.close();
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
Socket client = null;
try {
// 创建客户端套接字对象
client = new Socket("127.0.0.1", 8888);
new FileClient().uploadFile(client);
} catch (IOException e) {
e.printStackTrace();
}
}
}

编写Java程序,实现客户端向服务端上传文件的功能的更多相关文章

  1. 网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例

    UDP协议 (了解) 称之为数据包协议,又称不可靠协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需 ...

  2. Java 实现Redis客户端,服务端

    Java 实现Redis客户端,服务端 1.Java实现Redis发布订阅 1.1实例 2.[Redis]Java实现redis消息订阅/发布(PubSub) 3.java实现 redis的发布订阅 ...

  3. C# TCP实现多个客户端与服务端 数据 与 文件的传输

    C#菜鸟做这个东东竟然花了快三天的时间了,真是菜,菜,菜--- 下面是我用C#写的 一个简单的TCP通信,主要的功能有: (1) 多个客户端与服务器间的数据交流 (2)可以实现群发的功能 (3)客户端 ...

  4. 数据採集之Web端上传文件到Hadoop HDFS

    前言 近期在公司接到一个任务.是关于数据採集方面的. 需求主要有3个: 通过web端上传文件到HDFS; 通过日志採集的方式导入到HDFS; 将数据库DB的表数据导入到HDFS. 正好近期都有在这方面 ...

  5. java网络编程客户端与服务端原理以及用URL解析HTTP协议

    常见客户端与服务端 客户端: 浏览器:IE 服务端: 服务器:web服务器(Tomcat),存储服务器,数据库服务器. (注:会用到Tomact服务器,在webapps下有一个自己创建的目录myweb ...

  6. angulaijs中的ng-upload-file与阿里云oss服务的结合,实现在浏览器端上传文件到阿里云(速度可以达到1.5M)

    2015-10-26 angularjs结合aliyun浏览器端oos文件上传加临时身份验证例子 在服务端获取sts 源码: public class StsServiceSample { // 目前 ...

  7. 在CentOS7上安装ftp服务器用于保存服务端上传的图片。

    1.CentOS卸载vsftpd的方法 如果服务器上已经安装了vsftpd服务,配置出错需要卸载vsftpd服务. 1.1 查找vsftpd服务 [root@localhost /]# rpm -aq ...

  8. 客户端(Winform窗体)上传文件到服务器(web窗体)简单例子

    客户端:先创建一个winform窗体的应用程序项目 项目结构

  9. app端上传文件至服务器后台,web端上传文件存储到服务器

    1.android前端发送服务器请求 在spring-mvc.xml 将过滤屏蔽(如果不屏蔽 ,文件流为空) <!-- <bean id="multipartResolver&q ...

随机推荐

  1. Linux启动初始化配置文件

    Linux启动初始化配置文件(1)/etc/profile 登录时,会执行. 全局(公有)配置,不管是哪个用户,登录时都会读取该文件. (2)/ect/bashrc Ubuntu没有此文件,与之对应的 ...

  2. Linux学习 - 关机重启退出命令

    一.shutdown 1 功能 关机.重启操作 2 语法 shutdown  [-chr]  [时间选项] -h 关机 -r 重启 -c 取消前一个关机命令 二.halt.poweroff(关机) 三 ...

  3. redis入门到精通系列(三):key的通用操作和redis内部db的通用操作

    五种数据类型都用到了key,key本身是一种字符串,通过key可以获取redis中保存的对象.这一篇博客就将介绍key的通用操作. (一)key基本操作 删除key del key key是否存在 e ...

  4. js - 日期、时间 Date对象方法

    Date 是 JS 内置的日期构造函数 var d = new Date();  // 这个是系统当前时间的日期实例 d.getYear(); // 返回 d 实例年份 - 1900 d.getFul ...

  5. 为什么企业全面云化需要IT战略支撑和驱动?

    引子:为什么传统企业全面云化一直磨磨唧唧举步维艰? 笔者将企业上云大体上分为几个阶段: 第一个阶段是基础设施虚拟化.即将应用从物理机搬到(lift and shift migration)虚拟机上.基 ...

  6. python内置模块(一)

    re模块 基本操作方法 1.使用findall方法可以根据正则表达式筛选所有符合的字符.基本句式为: re.findall('正则表达式',待匹配的字符) 结果为一个列表,没有结果为空列表. 2.使用 ...

  7. AT266 迷子のCDケース 题解

    Content 有 \(n+1\) 个碟,编号为 \(0\sim n\),一开始 \(0\) 号碟在播放机上,其他的碟依次放进了 \(n\) 个盒子里面.现在有 \(m\) 次操作,每次操作找到当前在 ...

  8. 端云协同,打造更易用的AI计算平台

    内容来源:华为开发者大会2021 HMS Core 6 AI技术论坛,主题演讲<端云协同,HUAWEI HiAI Foundation打造更易用的AI计算平台>. 演讲嘉宾:华为海思AI技 ...

  9. java 常用类库:时间类LocalDate;LocalTime;LocalDateTime;Calendar 类;Date ;

    LocalDate类 LocalDate类代表不带时区的日期,列入2020-12-20.该类提供了静态的now()方法来获取当前的日期.这个类是线程安全的. LocalTime类 代表不带时区的时间, ...

  10. maven打包 运行出现 错误: 找不到或无法加载主类 jar

    使用maven进行打包成jar包后 使用java -jar运行jar包 出现 错误: 找不到或无法加载主类 jar 主要是由于依赖没下载好,重新下载依赖 以及要在项目的pom.xml里面添加 < ...