【代码笔记】Java深入学习——实现客户端发送文件到服务器的文件传输
- Server.java
package com.huaxin.lesson02; import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @thing 实现客户端发送文件到服务器
* @thing 客户端发送到客户端(本代码未实现)
* @author Administrator
*
*/ public class Severs {
public static void main(String[] args) {
new Severs().initServer();
} public void initServer() {
try {
ServerSocket sSocket = new ServerSocket(9191);
System.out.println("服务器创建成功!");
Socket socket = sSocket.accept();
System.out.println("有客户端链接成功!");
//准备两个流:文件输出流,socket输入流
InputStream ins = socket.getInputStream();
//将客户端上传的文件存到服务器里面
ObjectInputStream ois = new ObjectInputStream(ins);
FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\临时文档\\test\\2016毕晚策划4月19(1).doc");
System.out.println("开始读取文件……"); //1.读取的数组长度
int lenght = ois.readInt();
//2.读取次数
long times = ois.readLong();
//3.读取最后一次字节长度
int lastBytes = ois.readInt();
byte[] bytes = new byte[lenght];
// ois.read(bytes);
/**和read相比,都是读一个字节数组
* read不一定能读完2048个字节里面的全部字节,会继续往下走
* readFully是通信里面才用到的函数,将会判断流里面还有没有字节剩余
* 有一种情况,会在字节数组里面没有将全部字节传送到位,而阻塞在网络上,或者阻塞到发送端的网卡上
* readFully方法,会等大byte数组中所有数据全部读取完毕后,继续往下执行
* read方法,会检测流中是否还有剩余字节,如果没有,则会继续往下执行
*
**/
//循环读取文件
while(times > 1){
ois.readFully(bytes);
fos.write(bytes);
fos.flush();
times -- ;
}
//处理最后一次字节数组
bytes = new byte[lastBytes];
ois.readFully(bytes);
fos.write(bytes);
fos.flush(); // //即将读取的文件字节数
// long fileSize = ois.readLong();
// System.out.println(fileSize);
//
// int value = ins.read();
// while(fileSize > 0){
// fileSize--;
// fos.write(value);
// fos.flush();
// value = ins.read();
// }
System.out.println("文件接收完毕!已保存到服务器。");
ois.close();
fos.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
} }- Client.java
package com.huaxin.lesson02; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket; import org.omg.CORBA.portable.InputStream; public class Client {
public int val = 2048;
public static void main(String[] args) {
new Client().initClient();
} public void initClient() {
try {
Socket socket = new Socket("localhost",9191);
//准备两个流,文件输入流,socket输入流
//本地的输入流
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\临时文档\\test\\2016毕晚策划4月19.doc");
//把本地的输入流发出去
OutputStream ous = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(ous); System.out.println("开始读发送文件……!");
//先获取文件大小
File file = new File("C:\\Users\\Administrator\\Desktop\\临时文档\\test\\2016毕晚策划4月19.doc");
long fileSize = file.length();
byte[] bytes = new byte[val]; //算出即将发送字节数组的字数
long times = fileSize/val+1;
//算出最后一组字节数组的有效字节数
int lastBytes = (int)fileSize%2048;
//1.发送字节数组长度
oos.writeInt(val);
//2.发送次数
oos.writeLong(times);
oos.flush();
//3.最后一次字节个数
oos.writeInt(lastBytes);
oos.flush(); //读取字节数组长度的字节,返回读取字节数中的数据个数
int value = fis.read(bytes);
while(value != -1){
//偏移字节数读取
oos.write(bytes,0,value);
oos.flush();
value = fis.read(bytes);
} // oos.writeLong(fileSize);
// oos.flush();
// System.out.println(fileSize);
//// ous.write((int)fileSize);
//// ous.flush();
//// System.out.println(fileSize);
//// Thread.sleep(2000);
//
// //读取文件中的字节数据
// int value = fis.read();
// while(value != -1){
// ous.write(value);
// ous.flush();
// value = fis.read();
// }
System.out.println("文件发送完毕!");
Thread.sleep(2000);
//关闭流
fis.close();
ous.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}- 笔记都在代码里面
【代码笔记】Java深入学习——实现客户端发送文件到服务器的文件传输的更多相关文章
- 编写Java程序,实现客户端向服务端上传文件的功能
查看本章节 查看作业目录 需求说明: 实现客户端向服务端上传文件的功能 当启动服务端后,运行客户端程序,系统提示客户在客户端输入上传文件的完整路径.当客户在客户端输入完成后,服务端实现文件上传 实现思 ...
- [笨木头FireFly 02]入门篇2_客户端发送请求,服务器处理请求
原地址:http://www.9miao.com/question-15-53940.html 好,经过上一篇不权威的讲解,大家已经能轻易地让客户端和服务端连接起来了. 但是,仅仅是连接了,可它们俩不 ...
- 集合总结(全是代码)----------java基础学习
前言:在刚学习的时候,切记不能粘贴复制,更不能眼高手低,再简单的代码,都要自己独立动手写. 第一步:目录结构 第二步:代码区 Student.java:(一个学生的实体类) package com.m ...
- 学习笔记:oracle学习一:oracle11g体系结构之服务器结构、数据字典
目录 1.服务器架构 1.1 系统全局区SGA 1.1.1 高速数据缓冲区(database buffer cache) 1.1.2 重做日志缓冲区(redo log buffer cache) 1. ...
- Java爬虫学习(2)之用对象保存文件demo(1)
package com.mieba.spider; import java.util.ArrayList; import java.util.List; import java.util.Vector ...
- [原创]java WEB学习笔记18:java EE 中的MVC 设计模式(理论)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- java web学习笔记-Servlet篇
Servlet基础 1.Servlet概述 JSP的前身就是Servlet.Servlet就是在服务器端运行的一段小程序.一个Servlet就是一个Java类,并且可以通过“请求-响应”编程模型来访问 ...
- Android(java)学习笔记206:利用开源SmartImageView优化网易新闻RSS客户端
1.我们自己编写的SmartImageView会有很多漏洞,但是我们幸运的可以在网上利用开源项目的,开源项目中有很多成熟的代码,比如SmartImageView都编写的很成熟的 国内我们经常用到htt ...
- Android(java)学习笔记205:网易新闻RSS客户端应用编写逻辑过程
1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...
随机推荐
- 如何在UITableViewController上添加一个固定的视图
最近在使用UITableViewController,想在上面添加一个固定的视图,不随ScrollView滑动而移动.最后找到2种解决办法,一种是计算TableView的偏移,调整视图的位置,不断更新 ...
- SQl 根据某列去重 partition by
主键为ID select * from [infotops] where Id in (select max(id) from [infotops] group by InfoId) -------- ...
- 洛谷 P1546 最短网络 Agri-Net(最小生成树)
嗯... 题目链接:https://www.luogu.org/problemnew/show/P1546 首先不难看出这道题的思想是用了最小生成树,但是这道题有难点: 1.读题读不明白 2.不会读入 ...
- 【转】nginx在Windows系统启动不了
这几天用到Nginx,第一次是win7系统下部署,一次性成功,第二次在win10系统下,部署失败. 出现的情况: 打开Nginx.exe,界面一闪而过,而且进程里面搜不到Nginx. 1.端口占用问题 ...
- 创建一个流(Stream)可以让Bitmap或Image保存到流里面
创建一个流(Stream)可以让Bitmap或Image保存到流里面 http://blog.csdn.net/angxiao/article/details/7481465 写文件流 ...
- CNN 卷积神经网络结构
cnn每一层会输出多个feature map, 每个Feature Map通过一种卷积滤波器提取输入的一种特征,每个feature map由多个神经元组成,假如某个feature map的shape是 ...
- 兼容 火狐、IE 的中a标签用 javascript:void(0); 依然执行跳转的问题
<a onclick="return false;" href="javascript: void(0)" target="_blank&quo ...
- PIE SDK与IDL算法结合说明文档
1.功能简介 IDL是一门简单易用的科学计算和可视化语言,包含大量的图形图像处理函数,尤其是同ENVI结合集成了该软件的大量功能,因此被广泛用于遥感.地信领域. 本示例程序实现了IDL算法与PIESD ...
- Python 时间格式转换
Python time, datetime模块常用方法 1.使用time模块,获取当前时间戳~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~import timetime.time( ...
- my31_MGR单写模式压测以及对比普通从库记录
场景MGR单写模式三节点,db46写节点,db47/db48为读节点工具sysbencn.压测15个小时,db46上18线程纯写,12线程oltp混合测试,db48上12线程select在压测2个小时 ...