自己动手写简单的web应用服务器(4)—利用socket实现文件的下载

直接上源码:

服务器:

 1 package download;
 2
 3 import java.io.BufferedInputStream;
 4 import java.io.BufferedOutputStream;
 5 import java.io.File;
 6 import java.io.FileInputStream;
 7 import java.io.IOException;
 8 import java.io.OutputStream;
 9 import java.net.ServerSocket;
10 import java.net.Socket;
11
12 /**
13  * 目的:利用socket实现文件的下载。当有客户端连接到服务器时,自动从服务器上下载文件,客户端
14  *     按照系统毫秒数对下载的文件命名。
15  * 准备:服务器上准备要下载的文件d:/1.mp3。客户端接受文件后,将文件保存在d盘,文件采取系统毫秒数命名。
16  */
17 public class Server {
18
19     private ServerSocket ss;
20     private int port = 8080;//服务器开放的端口号
21     /**利用构造方法,初始化ServerSocket*/
22     public Server(){
23         try {
24             ss = new ServerSocket(port);
25         } catch (IOException e) {
26             e.printStackTrace();
27         }
28     }
29     /**服务器启动,等待客户端进入。当客户端进入,就产生socket对象,并将该对象交给线程去执行*/
30     public void start(){
31         while(true){
32             try {
33                 Socket s = ss.accept();//等待客户端进入
34                 Thread thread = new Thread(new Handler(s));//利用构造器传参数
35                 thread.run();
36             } catch (IOException e) {
37                 e.printStackTrace();
38             }
39         }
40     }
41     private class Handler implements Runnable {
42         private Socket s;
43         private byte[] buf = new byte[1024];//1K大小的缓冲区
44         public Handler(Socket s) {
45             this.s = s;
46         }
47
48         public void run() {
49             try {
50                 File sourceFile = new File("d:/1.mp3");
51                 FileInputStream fis = new FileInputStream(sourceFile);
52                 BufferedInputStream bis = new BufferedInputStream(fis);
53                 OutputStream os = s.getOutputStream();
54                 BufferedOutputStream bos = new BufferedOutputStream(os);
55                 int size = -1;
56                 while((size=bis.read(buf))!=-1){
57                     bos.write(buf,0,size);
58                     bos.flush();
59                 }
60                 s.close();
61                 fis.close();
62             } catch (Exception e) {
63                 e.printStackTrace();
64             }
65         }
66
67     }
68     public static void main(String[] args) {
69         Server s = new Server();
70         s.start();
71     }
72 }

客户端:

 1 package download;
 2
 3 import java.io.BufferedInputStream;
 4 import java.io.BufferedOutputStream;
 5 import java.io.File;
 6 import java.io.FileOutputStream;
 7 import java.io.IOException;
 8 import java.io.InputStream;
 9 import java.net.Socket;
10 import java.net.UnknownHostException;
11 /**客户端程序,负责从客户端下载文件*/
12 public class Client {
13     private Socket s;
14     private byte[] buf = new byte[1024];//1K大小的缓冲区
15
16     public void start(){
17         try {
18             s = new Socket("192.168.1.103", 8080);
19             String fileName = "d:/"+System.currentTimeMillis()+".mp3";
20             File targetFile = new File(fileName);
21             targetFile.createNewFile();
22             FileOutputStream fos = new FileOutputStream(targetFile);
23             BufferedOutputStream bos = new BufferedOutputStream(fos);
24             InputStream is = s.getInputStream();
25             BufferedInputStream bis = new BufferedInputStream(is);
26             int size = -1;
27             while((size=bis.read(buf))!=-1){
28                 bos.write(buf,0,size);
29                 bos.flush();
30             }
31             s.close();
32             fos.close();
33         } catch (UnknownHostException e) {
34             e.printStackTrace();
35         } catch (IOException e) {
36             e.printStackTrace();
37         }
38     }
39     public static void main(String[] args) {
40         Client c = new Client();
41         c.start();
42     }
43 }
时间: 2024-10-27 13:38:08

自己动手写简单的web应用服务器(4)—利用socket实现文件的下载的相关文章

自己动手写简单的web应用服务器(3)—服务器从磁盘文件中读取文本,发送给客户端

服务器: 1 package serverAndClient; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.InputStreamReader; 9 import java.io.OutputStream;

自己动手写简单的web应用服务器(1)—tcp通信

1.socket简介: socket通常称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.在Internet上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个socket,并绑定在一个端口上,不同的端口对应不同的服务. 应用程序通常通过"套接字",向网络发出请求或者应答网络请求.socket和serverSocket类位于java.net包中.serverScoket用于服务端,socket是建立网络连接时使用的.连接成功时,应用程序两端

自己动手写CPU 笔记

自己动手写CPU 跳转至: 导航. 搜索 文件夹 1 处理器与MIPS 2 可编程逻辑器件与Verilog HDL 3 教学版OpenMIPS处理器蓝图 4 第一条指令ori 5 逻辑.移位与nop 6 移动 7 算术 8 转移 9 Load/Store 10 协处理器 11 异常 12 实践版OpenMIPS 13 小型SOPC 14 验证 15 移植uC/OS-II 16 附录A 教学版OpenMIPS各个模块的接口说明 17 附录B OpenMIPS实现的全部指令及相应机器码 18 參考文

《自己动手写开源框架10》:Web界面快速开发实践

下面是一些常用的链接,供大家使用: GIT地址:https://git.oschina.net/tinyframework/tiny问题报告:https://git.oschina.net/tinyframework/tiny/issues更多内容,请看本人博客,不一样的内容,一样的精彩! 在展示过程的同时,会把相关的知识做一个充分的介绍 .一.寻找网站模板 要做网站,不能没有模板,自己不会做网页设计,咋办?问谷歌找百度呗,找了一阵,看到下面这个模板不错,就它了. http://www.toop

《自己动手写框架4》:分布式锁的简单实现

分布式锁在分布式应用当中是要经常用到的,主要是解决分布式资源访问冲突的问题.  一开始考虑采用ReentrantLock来实现,但是实际上去实现的时候,是有问题的,ReentrantLock的lock和unlock要求必须是在同一线程进行,而分布式应用中,lock和unlock是两次不相关的请求,因此肯定不是同一线程,因此导致无法使用ReentrantLock. 接下来就考虑采用自己做个状态来进行锁状态的记录,结果发现总是死锁,仔细一看代码,能不锁死么. public synchronized

自己动手写web框架----1

本文可作为<<自己动手写struts–构建基于MVC的Web开发框架>>一书的读书笔记. 一个符合Model 2规范的web框架的架构图应该如下: Controller层的Servlet就是一个全局的大管家,它判断各个请求由谁去处理. 而各个BusinessLogic就决定具体做什么. 通过上面的图,我们能看出来核心的组件就是那个servlet,它要处理所有的请求. 那么我们就先在web.xml里配置这个servlet: <?xml version="1.0&quo

自己动手写CPU之第七阶段(2)——简单算术操作指令实现过程

将陆续上传本人写的新书<自己动手写CPU>,今天是第25篇,我尽量每周四篇 亚马逊的预售地址如下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8/ref=cm_sw_r_si_dp_5kq8tb1gyhja4 China-pub的预售地址如下: http://product.china-pub.com/3804025 7.2 简单算术操作指令实现思路 虽然简单算术操作指令的数目比较多,有15条,但实现方式都是相似的,与前几章逻辑.移位操作指令的实现方式也

自己动手写CPU之第七阶段(3)——简单算术操作指令实现过程(续)

将陆续上传本人写的新书<自己动手写CPU>,今天是第26篇,我尽量每周四篇 China-pub的预售地址如下(有目录.内容简介.前言): http://product.china-pub.com/3804025 亚马逊的预售地址如下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8/ref=cm_sw_r_si_dp_5kq8tb1gyhja4 为了实现简单算术指令,需要修改译码阶段的ID模块.执行阶段的EX模块,上一篇博文中已经介绍了对译码阶段ID模块的

如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1

原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个iPhone/iPad开发者,能够自己写一个简单的web服务器将是很有用的. 例如,你可能希望在软件启动时显示一些来自服务器的更新,或者在服务器端保存一些用户数据.除了你的想象力,没有什么能限制你了. 在第一篇中,我们将会一步一步的建立一个web服务器,基于promo code system(促销码系