自己动手写简单的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;
10 import java.io.OutputStreamWriter;
11 import java.io.PrintWriter;
12 import java.net.ServerSocket;
13 import java.net.Socket;
14
15 /**
16  * 任务目的:当有客户端进入的时候,服务器就会从磁盘文件读取一段文本,
17  *              将该文本信息发送给客户端。
18  * 准备工作:预先在D盘建立一个txt文件。文件路径:D:\1.txt
19  */
20 public class Server {
21
22     private ServerSocket ss;
23     /**端口号*/
24     private int port = 8081;
25     /**利用构造方法,初始化ServerSocket*/
26     public Server() {
27         try {
28             ss = new ServerSocket(port);
29         } catch (IOException e) {
30             e.printStackTrace();
31         }
32     }
33     /**服务器启动,等待客户端进去,并产生Socket对象,将该对象交给线程去执行*/
34     public void start(){
35         while(true){
36             try {
37                 Socket s = ss.accept();//等待客户端进入
38                 Thread thread = new Thread(new Handler(s));
39                 thread.run();
40             } catch (IOException e) {
41                 e.printStackTrace();
42             }
43         }
44     }
45
46     private class Handler implements Runnable {
47         private Socket s;
48         public Handler(Socket s) {
49             this.s = s;
50         }
51
52         @Override
53         public void run() {
54             try {
55                 File file = new File("D:/1.txt");
56                 InputStream is = new FileInputStream(file);
57                 BufferedReader reader = new BufferedReader(
58                         new InputStreamReader(is, "GBK"));
59                 OutputStream os = s.getOutputStream();
60                 PrintWriter writer = new PrintWriter(new OutputStreamWriter(os));
61                 String str =null;
62                 while(true){
63                     str = reader.readLine();//循环读取文本
64                     if(str==null) break;//读取到文件尾部,跳出循环
65                     writer.println(str);
66                     writer.flush();
67                 }
68                 is.close();
69                 s.close();
70             } catch (Exception e) {
71                 e.printStackTrace();
72             }
73         }
74
75     }
76     public static void main(String[] args) {
77         Server s = new Server();
78         s.start();
79     }
80
81 }

客户端:

 1 package serverAndClient;
 2
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.io.InputStreamReader;
 7 import java.io.OutputStream;
 8 import java.io.OutputStreamWriter;
 9 import java.net.Socket;
10 import java.net.UnknownHostException;
11
12 import org.xml.sax.InputSource;
13 /**客户端程序,接受从服务器发来的消息*/
14 public class Client {
15     private Socket s;
16
17     /**客户端程序启动*/
18     public void start(){
19         try {
20             s = new Socket("192.168.1.103", 8081);
21             InputStream is = s.getInputStream();
22             BufferedReader reader = new BufferedReader(new InputStreamReader(is,"GBK"));
23             String str = null;
24             while(true){
25                 str = reader.readLine();
26                 if(str==null){
27                     break;
28                 }
29                 System.out.println(str);
30             }
31             s.close();
32         } catch (UnknownHostException e) {
33             e.printStackTrace();
34         } catch (IOException e) {
35             e.printStackTrace();
36         }
37     }
38     public static void main(String[] args) {
39         Client client = new Client();
40         client.start();
41     }
42 }
时间: 2024-10-08 06:30:20

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

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

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

自己动手写简单的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.Ser

自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明

将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到访问链接状态位LLbit,可以将LLbit当做寄存器处理,ll指令需要写该寄存器,sc指令需要读该寄存器,同时,与对通用寄存器的访问一样,对LLbit寄存器的写操作也放在回写阶段进行. ll指令在访存阶段要读取数据存储器中指定地址的数据,还要设置对LLbit寄存器的写操作,写入的值为1,这个写操作会通过MEM/WB模块传递到回写阶段,最终实现对LLbit寄存器的写. s

自己动手写CPU之第九阶段(7)——MIPS32中的LL、SC指令说明

将陆续上传新书<自己动手写CPU>,今天是第46篇. 在MIPS32指令集中有两条特殊的存储加载指令:链接加载指令LL.条件存储指令SC,本次将介绍这两条指令,在后续将实现这两条指令. 9.6 链接加载指令ll.条件存储指令sc说明 在本章前面的部分,笔者花费很多笔墨介绍了OpenMIPS中除ll.sc之外的加载.存储指令的实现过程,本节至9.9节将专门介绍链接加载指令ll.条件存储指令sc的实现过程.ll.sc指令是MIPS32指令集架构中比较特殊的加载存储指令,用来实现信号量机制. 在多线

自已动手写的轮播图插件,功能不断增加中,可以下载

前,平时总是使用别人的轮播图插件,这次决定自已写一个,功能越多越好.实际现起来,发现并不容易.先实现基本的功能,下两周要丰富起来. 图是别人的图,心是自已的心.直接上代码: 一:结构 <!-- carousel begin --><div class="carousel-wrap">    <div class="carousel-main-wrap">        <ul class="carousel-scr

web页面的数据从excel中读取

# -*- coding: utf-8 -*- import xdrlib ,sysimport xlrdimport datetimeimport jsonimport conf,reimport os def open_excel(file= 'file.xlsx'): try: data = xlrd.open_workbook(file) return data except Exception,e: print str(e) #根据名称获取Excel表格中的数据 参数:file:Exc

写给java web一年左右工作经验的人

摘要 大学就开始学习web,磕磕绊绊一路走过来,当中得到过开源社区很多的帮助,总结了这些年来的技术积累,回馈给开源社区. ps:图片都是从网上盗...感谢原作者. ps:文字千真万确都是我自己写的. 在此,特别感谢Hansen,他曾经有私的帮助过我(两包零食),他是一个很强的启蒙胖子. 我把我这些年在java学习中学到的东西,按照项目开发中可能遇见的场景,进行了一次梳理. 这个故事是我最后决定加上来的,我非常喜欢这个故事,软件工程中有一个被戏称为Cargo Cult编程法的编程风格,而下面这个故

《自己动手写开源框架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