编写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 ...
随机推荐
- C++ 数组元素循环右移问题
这道题要求不用另外的数组,并且尽量移动次数少. 算法思想:设计一个结构体存储数组数据和它应在的索引位置,再直接交换,但是这种方法不能一次性就移动完成,因此再加一个判断条件.等这个判断条件满足后就退出循 ...
- java多线程 并发编程
一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种 ...
- NSURLSession下载文件-代理
- 3.1 涉及知识点(1)创建NSURLSession对象,设置代理(默认配置) ```objc //1.创建NSURLSession,并设置代理 /* 第一个参数:session对象的全局配置设置 ...
- Spring(4):Mybatis和Spring整合
第一步:创建数据库 MySQL代码 1 CREATE DATABASE `mybatis` ; 2 3 USE `mybatis`; 4 5 CREATE TABLE `user` ( 6 `id` ...
- highchars操作集合
一.tooltip 与鼠标指针的距离想调整tooltip和鼠标指针的距离,官方api 和中文api中都没写,只有轴 label.distance . 但我觉得应该有这个,看源码果然有 tooltip ...
- spring基于注解的声明式事务控制
package com.hope.service.impl;import com.hope.dao.IAccountDao;import com.hope.domain.Account;import ...
- 如何优雅正确地通过interrupt方法中断线程
为什么废弃Thread的stop函数? 简单来说就是stop方法中断线程太过暴力随意,且会是否线程持有的锁,会导致线程安全问题.还有可能导致存在需要被释放的资源得不到释放,引发内存泄露.所以用stop ...
- 前端浅谈-协议相关(http/https)
当DNS工作完之后得到了一个网址 https//192.168.1.255/index.html 这个并不符合标准的请求路径.接下来就是https的功能了.讲https前先讲讲它的前身http协议 H ...
- [Java Web 王者归来]读书笔记1
第一章 Java web 开发概述 1 WEB服务器运行时一直在TCP 80(默认端口)监听, 若使用其他端口在url中需要显示标注端口号(例如:8080) 2 WEB服务器:微软的IIS.Apach ...
- CF699A Launch of Collider 题解
Content 有 \(n\) 辆车在一条数轴上,第 \(i\) 辆车在 \(a_i\) 上,每辆车要么向左,要么向右.开始,它们以 \(1\) 个单位每秒的速度在行驶.问你第一次撞车发生在第几秒的时 ...