编写Java程序,实现客户端向服务端上传文件的功能
查看本章节
查看作业目录
需求说明:
实现客户端向服务端上传文件的功能
当启动服务端后,运行客户端程序,系统提示客户在客户端输入上传文件的完整路径。当客户在客户端输入完成后,服务端实现文件上传


实现思路:
- 创建客户端类 FileClient 和服务端类 FileServer
- 在客户端类中定义uploadFile(Socket socket)方法,用于上传文件,使用BufferedOutputStream包装socket中输入流对象,使用new FileInputStream输入流对象读取本地文件,使用输出流将文件利用socket管道将数据循环发送至服务端
- 在客户端FileCliet类中,使用new Socket连接本地服务端和端口,调用uploadFile方法实现文件上传
- 在服务端类FileServer中,定义downFile()方法用于下载文件,该方法中使用BufferedInputStream包装socket中的输入流读取文件内容,并且使用FileOutputStream写到本地
- 分别运行服务端和客户端程序进行测试
实现代码:
服务端类 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程序,实现客户端向服务端上传文件的功能的更多相关文章
- 网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例
UDP协议 (了解) 称之为数据包协议,又称不可靠协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需 ...
- Java 实现Redis客户端,服务端
Java 实现Redis客户端,服务端 1.Java实现Redis发布订阅 1.1实例 2.[Redis]Java实现redis消息订阅/发布(PubSub) 3.java实现 redis的发布订阅 ...
- C# TCP实现多个客户端与服务端 数据 与 文件的传输
C#菜鸟做这个东东竟然花了快三天的时间了,真是菜,菜,菜--- 下面是我用C#写的 一个简单的TCP通信,主要的功能有: (1) 多个客户端与服务器间的数据交流 (2)可以实现群发的功能 (3)客户端 ...
- 数据採集之Web端上传文件到Hadoop HDFS
前言 近期在公司接到一个任务.是关于数据採集方面的. 需求主要有3个: 通过web端上传文件到HDFS; 通过日志採集的方式导入到HDFS; 将数据库DB的表数据导入到HDFS. 正好近期都有在这方面 ...
- java网络编程客户端与服务端原理以及用URL解析HTTP协议
常见客户端与服务端 客户端: 浏览器:IE 服务端: 服务器:web服务器(Tomcat),存储服务器,数据库服务器. (注:会用到Tomact服务器,在webapps下有一个自己创建的目录myweb ...
- angulaijs中的ng-upload-file与阿里云oss服务的结合,实现在浏览器端上传文件到阿里云(速度可以达到1.5M)
2015-10-26 angularjs结合aliyun浏览器端oos文件上传加临时身份验证例子 在服务端获取sts 源码: public class StsServiceSample { // 目前 ...
- 在CentOS7上安装ftp服务器用于保存服务端上传的图片。
1.CentOS卸载vsftpd的方法 如果服务器上已经安装了vsftpd服务,配置出错需要卸载vsftpd服务. 1.1 查找vsftpd服务 [root@localhost /]# rpm -aq ...
- 客户端(Winform窗体)上传文件到服务器(web窗体)简单例子
客户端:先创建一个winform窗体的应用程序项目 项目结构
- app端上传文件至服务器后台,web端上传文件存储到服务器
1.android前端发送服务器请求 在spring-mvc.xml 将过滤屏蔽(如果不屏蔽 ,文件流为空) <!-- <bean id="multipartResolver&q ...
随机推荐
- Git的使用-一个分支完全替换另一个分支
之前公司git分支混乱,今天花时间整理了一下,在合并分支的时候遇到一个问题: 一个很久没有拉取远程代码的分支与master分支合并时,出现冲突之外,还会丢失文件,很头疼,然后找到了下面的方法,可以直接 ...
- JavaBean的命名规则
JavaBean的命名规则Sun 推荐的命名规范1 ,类名要首字母大写,后面的单词首字母大写2 ,方法名的第一个单词小写,后面的单词首字母大写3 ,变量名的第一个单词小写,后面的单词首字母大写为了使 ...
- Linux脚本教程
Linux_Shell_脚本参数接收键盘输入 #!/bin/bash #提示"请输入姓名"并等待30秒,把用户的输入保存入变量name中 read -t 30 -p "请 ...
- centos源码部署lua-5.3
目录 一.介绍 二.部署 三.测试 一.介绍 Luat语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式程序移植到其他应用程序,它是由C语言实现的,虽然简单小巧但是功能强大. 二.部 ...
- Windows FILETIME 与UNIX时间的转换
windows FILETIME时间从1601/01/01 零时零分零秒开始计时,windows每个时钟滴答将计数加一,每个时钟滴答的间隔是100 nanoseconds(纳秒,1秒=10的九次方纳秒 ...
- tomcat架构分析及配置详解
浏览器访问服务器的流程 请求发起的过程: 注意:浏览器访问服务器使用的是http协议,http是应用层协议,而具体传输还是使用的TCP/IP协议 Tomcat系统总架构 2.1 Tomcat请求处理过 ...
- Sentry 开发者贡献指南 - 前端 React Hooks 与虫洞状态管理模式
系列 Sentry 开发者贡献指南 - 前端(ReactJS生态) Sentry 开发者贡献指南 - 后端服务(Python/Go/Rust/NodeJS) 什么是虫洞状态管理模式? 您可以逃脱的最小 ...
- 记一次Linux bash 命令行卡顿排查之警惕LD_PRELOAD环境变量
现象: 通过屏幕或者ssh登录Linux操作系统(本例:Ubuntu)后,执行ls 需要数秒才返回 strace -c ls 查看实际命令调用耗时并不长 对比和正常执行的主机命令执行时,加载的库文件差 ...
- 在mybatis的@Select中用not in 时
当在mybatis中用not in 时,需要用${LocalOrderNo}这样的形式来代替,而不能用#{LocalOrderNo}(把它当成一个整体的字符串了) "SELECT * FRO ...
- layui踩过的坑
layui 表格合计行取整 原代码:(文件位置:..\layui\lay\modules\table.js) var e=o.totalRowText||"",i=parseFlo ...