查看本章节

查看作业目录


需求说明:

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

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

实现思路:

  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. vim中搜索指定单词(不加前后缀)

    \< : 搜索内容作为单词开头 \> : 搜索内容作为单词结尾 一起用即为将搜索内容指定为whole word e.g. : word_suffix word 如果用/word来搜索则两个 ...

  2. proguard 混淆工具的用法 (适用于初学者参考)

    一. ProGuard简介 附:proGuard官网 因为Java代码是非常容易反编码的,况且Android开发的应用程序是用Java代码写的,为了很好的保护Java源代码,我们需要对编译好后的cla ...

  3. 格式化代码(Eclipse 格式化代码块快捷键:Ctrl+Shift+F)

    1.格式化java代码 : ①Ctrl+Shift+F 但是我们会遇到按 Ctrl+Shift+F不起作用的时候?       Ctrl+Shift+F 在搜狗拼音里是简繁替换.一旦安装搜狗拼音这个快 ...

  4. Linux基础命令---mailq显示邮件队列

    mailq mailq指令可以显示出待发送的邮件队列. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora.   1.语法       mailq   2.选项参数列表 ...

  5. go channel 概述 - 管道

    概述 unix/linux OS 的一个进程的输出可以是另一个进程的输入,这些进程使用stdin与stdout设备作为通道,在进程之间传递数据. 同样的,GO中有io.Reader与io.Writer ...

  6. oc中调用c函数 实现将字符串转换成unsigned char

    帮助码友解决问题,从而复习了一下oc中调用c函数的方式 1,新建c 头文件  test.h 定义 c 函数 #ifndef test_h #define test_h void verificatio ...

  7. References in C++

    When a variable is declared as reference, it becomes an alternative name for an existing variable. A ...

  8. 连接 MySQL 数据库出现问题:The server time zone value ‘�й���׼ʱ��‘ is unrecogni....

    出现问题 The server time zone value '�й���׼ʱ��' is unrecogni.... 解决方案 在 URL 后面加上 ?serverTimezone=UTC 如下: ...

  9. 【Git】【Gitee】通过git远程删除仓库文件

    安装Git Git安装配置-菜鸟教程 没有安装下载的,请读者自行安装下载. 启动与初步配置 配置用户名与邮箱 git config --global user.name "用户名" ...

  10. 设计风格之REST

    一.简介 REST简介 REST 是英文 representational state transfer(表象性状态转变)或者表述性状态转 移;Rest 是 web 服务的一种架构风格;使用 HTTP ...