查看本章节

查看作业目录


需求说明:

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

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

实现思路:

  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基础命令---mail邮件管理程序

    mail mail是一个邮件的管理程序,可以用来发送或者接收邮件. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora.   1.语法       mail  [选项] ...

  2. GO 数字运算

    大整数运算 // bigint project main.go package main import ( "fmt" "math" "math/bi ...

  3. Linux磁盘与文件系统原理

    这一章主要是原理性的,介绍了Linux文件系统的运作原理.涉及到很多计算机组成和操作系统的原理性知识,这部分知识很多都忘了,在这里复习下.    我们只看本章第1,2节.--------------- ...

  4. IDE搬进浏览器里——JetBrains Projector

    发展 提起 JetBrains,你会想到什么?各路强大的 IDE,比如 Android Studio.IDEA.WebStorm--这些对于开发者来说耳熟能详的产品都出自这家公司,这些 IDE 的功能 ...

  5. Centos 7 安装redis,修改配置文件不生效、外网不能访问。

    前提: 在用Centos 7 安装 redis 时,遇上一下几个问题 ,记录下 . 1.修改配置文件,按官网步骤启动,不生效. 2.外网无法访问redis. 步骤: 1.打开centos 虚拟机 ,按 ...

  6. java关键字volatile内存语义详细分析

    volatile变量自身具有下列特性. 1.可见性.对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写 入. · 2.原子性:对任意单个volatile变量的读/ ...

  7. 使用jstl和el表达式来展示request域中存放的user对象的信息

    <%@ page import="java.util.ArrayList" %><%@ page import="java.util.List" ...

  8. 3.使用Spring Data ElasticSearch操作ElasticSearch(5.6.8版本)

    1.引入maven坐标 <!--spring-data-elasticsearch--><dependency> <groupId>org.springframew ...

  9. C# 使用modbus 读取PLC 寄存器地址

    使用的组件Nmodbus 定义参数,全局变量: //创建modbus实体对象 private static ModbusFactory modbusFactory; private static IM ...

  10. 华为云函数中使用云数据库的JavaScript SDK基础入门

    背景介绍 使用云数据库Server端的SDK,此处我以华为提供的官方Demo为例,他们的Demo也已经开源放在了GitHub上,大家需要的可以自行下载. https://github.com/AppG ...