java简单的单文件服务器

  该服务器的功能:无论接受到何种请求,都始终发送同一个文件。这个服务器命名为SingleFileHTTPServer,文件名、本地端口和内容编码方式从命令行读取。如果缺省端口,则假定端口号为80。如果缺省编码方式,则假定为ASCII。

代码为:

  1. import java.io.*;
  2. import java.net.ServerSocket;
  3. import java.net.Socket;
  4. public class SingleFileHTTPServer extends Thread {
  5. private byte[] content;
  6. private byte[] header;
  7. private int port=80;
  8. private SingleFileHTTPServer(String data, String encoding,
  9. String MIMEType, int port) throws UnsupportedEncodingException {
  10. this(data.getBytes(encoding), encoding, MIMEType, port);
  11. }
  12. public SingleFileHTTPServer(byte[] data, String encoding, String MIMEType, int port)throws UnsupportedEncodingException {
  13. this.content=data;
  14. this.port=port;
  15. String header="HTTP/1.0 200 OK\r\n"+
  16. "Server: OneFile 1.0\r\n"+
  17. "Content-length: "+this.content.length+"\r\n"+
  18. "Content-type: "+MIMEType+"\r\n\r\n";
  19. this.header=header.getBytes("ASCII");
  20. }
  21. public void run() {
  22. try {
  23. ServerSocket server=new ServerSocket(this.port);
  24. System.out.println("Accepting connections on port "+server.getLocalPort());
  25. System.out.println("Data to be sent:");
  26. System.out.write(this.content);
  27. while (true) {
  28. Socket connection=null;
  29. try {
  30. connection=server.accept();
  31. OutputStream out=new BufferedOutputStream(connection.getOutputStream());
  32. InputStream in=new BufferedInputStream(connection.getInputStream());
  33. StringBuffer request=new StringBuffer();
  34. while (true) {
  35. int c=in.read();
  36. if (c==‘\r‘||c==‘\n‘||c==-1) {
  37. break;
  38. }
  39. request.append((char)c);
  40. }
  41. //如果检测到是HTTP/1.0及以后的协议,按照规范,需要发送一个MIME首部
  42. if (request.toString().indexOf("HTTP/")!=-1) {
  43. out.write(this.header);
  44. }
  45. out.write(this.content);
  46. out.flush();
  47. } catch (IOException e) {
  48. // TODO: handle exception
  49. }finally{
  50. if (connection!=null) {
  51. connection.close();
  52. }
  53. }
  54. }
  55. } catch (IOException e) {
  56. System.err.println("Could not start server. Port Occupied");
  57. }
  58. }
  59. public static void main(String[] args) {
  60. try {
  61. String contentType="text/plain";
  62. if (args[0].endsWith(".html")||args[0].endsWith(".htm")) {
  63. contentType="text/html";
  64. }
  65. InputStream in=new FileInputStream(args[0]);
  66. ByteArrayOutputStream out=new ByteArrayOutputStream();
  67. int b;
  68. while ((b=in.read())!=-1) {
  69. out.write(b);
  70. }
  71. byte[] data=out.toByteArray();
  72. //设置监听端口
  73. int port;
  74. try {
  75. port=Integer.parseInt(args[1]);
  76. if (port<1||port>65535) {
  77. port=80;
  78. }
  79. } catch (Exception e) {
  80. port=80;
  81. }
  82. String encoding="ASCII";
  83. if (args.length>2) {
  84. encoding=args[2];
  85. }
  86. Thread t=new SingleFileHTTPServer(data, encoding, contentType, port);
  87. t.start();
  88. } catch (ArrayIndexOutOfBoundsException e) {
  89. System.out.println("Usage:java SingleFileHTTPServer filename port encoding");
  90. }catch (Exception e) {
  91. System.err.println(e);// TODO: handle exception
  92. }
  93. }
  94. }

SingleFileHTTPServer类本身是Thread的子类。它的run()方法处理入站连接。此服务器可能只是提供小文件,而且只支持 低吞吐量的web网站。由于服务器对每个连接所需完成的所有工作就是检查客户端是否支持HTTP/1.0,并为连接生成一两个较小的字节数组,因此这可能 已经足够了。另一方面,如果你发现客户端被拒绝,则可以使用多线程。许多事情取决于所提供文件的大小,每分钟所期望连接的峰值数和主机上Java的线程模 型。对弈这个程序复杂写的服务器,使用多线程将会有明显的收益。

Run()方法在指定端口创建一个ServerSocket。然后它进入无限循环,不断地接受连接并处理连接。当接受一个socket时,就会由一 个InputStream从客户端读取请求。它查看第一行是否包含字符串HTTP。如果包含此字符串,服务器就假定客户端理解HTTP/1.0或以后的版 本,因此为该文件发送一个MIME首部;然后发送数据。如果客户端请求不包含字符串HTTP,服务器就忽略首部,直接发送数据。最后服务器关闭连接,尝试 接受下一个连接。

而main()方法只是从命令行读取参数。从第一个命令行参数读取要提供的文件名。如果没有指定文件或者文件无法打开,就显示一条错误信息,程序退 出。如果文件能够读取,其内容就读入byte数组data.关于文件的内容类型,将进行合理的猜测,结果存储在contentType变量中。接下来,从 第二个命令行参数读取端口号。如果没有指定端口或第二个参数不是0到65535之间的整数,就使用端口80。从第三个命令行参数读取编码方式(前提是提供 了)。否则,编码方式就假定为ASCII。然后使用这些值构造一个SingleFileHTTPServer对象,开始运行。这是唯一可能的接口。

时间: 2024-10-01 05:03:09

java简单的单文件服务器的相关文章

JAVA基础英语单词表(下)

quantity                     / 'kw?ntiti /                    量,数量 query                            / 'kwi?ri /                       查询 queue                           / kju: /                                队列 rate                          / reit /

Java简单语法与访问权限修饰符

Java简单语法总结 一:Java简单语法概述 1:分号,关键字,空白(空格,空白行),花括号和注释的使用. 2:标识符的规则(命名规则与业内约定). 3:Java表达式(逗号,问号和逻辑表达式). 二:分号,关键字,空白(空格,空白行),花括号和注释的使用 1:分号  在Java中通常用来分隔语句,即作为分隔符,另外它也是一个语句结束的标志. 2:关键字 通俗的理解,在编译器Eclipse中像"public","class"这些输入的时候就带有颜色的字成为关键字,

Android:实现最简单的单指移动、双指缩放的图片组件

本例实现了最简单的单指移动.双指缩放的图片组件,效果图如下:             功能: 1.单指移动,双指缩放. 2.可控制缩放范围,防止过大或过小:初始化时自动缩放至组件大小,并居中显示. 3.边界控制,防止图片"移出去了". 4.可使用在xml中,并自动适应组件大小. 5.代码简洁!!! 核心代码:DragScaleView.java package com.sina.simplegestureimage; import android.content.Context; im

关于java写一个单例类(面试手写题)

package com.shundong.javacore; /** * java写一个简单的单例类 * @author shundong * */ class Singleton { //使用一个类变量来缓存曾经创建的实例 private static Singleton instance; //对构造进行隐藏(private) private Singleton(){} /** * 提供一个静态方法 * 该方法加入了自定义控制 保证只产生一个Singleton对象 * @return 返回S

如何利用jQuery进行简单表单验证

如何利用jQuery进行简单表单验证:利用jQuery可以进行表单验证,当然有比较复杂的表单验证,这里就不介绍了,下面就简单介绍一下如何使用jQuery进行简单的表单验证,然后大家可以通过改造进行基本的表达验证了.先看一段代码实例: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http

zoj Fibonacci Numbers ( java , 简单 ,大数)

题目 //f(1) = 1, f(2) = 1, f(n > 2) = f(n - 1) + f(n - 2) import java.io.*; import java.util.*; import java.math.*; public class Main { /** * @xqq */ public BigInteger an(int n) { BigInteger c; BigInteger a = BigInteger.valueOf(1); BigInteger b = BigIn

simple-spa 一个简单的单页应用实例

上两篇文章说过要写一个简单的单页应用例子的, 迟迟没有兑诺, 实在有愧 哈哈.这篇写给小白用户哈. 正好趁今天风和日丽,事情不多, 把从项目里的代码扣取了一下, 整理了一个简单的例子.因为我们生产项目用到es6 还有构建工具,为了让例子足够简单和原生,除了一个zepto,连require都是我之前写的文章里的实现的,很简单70行代码. 事例地址 github:https://github.com/skyweaver213/simple-spa demo: https://skyweaver213

rabbitmq的java简单实现

1,安装rabbitmq.我的是ubuntu14.04,在官网上面下载最新的安装文件http://www.rabbitmq.com/install-debian.html 2.安装完之后  启动rabbitmq, sudo rabbitmq-server 3.下载jar包 4.最简单的hello world的实现 Sender类 package com.lubby.test; import java.io.IOException; import com.rabbitmq.client.Chann

Java简单聊天室

实现Java简单的聊天室 所用主要知识:多线程+网络编程 效果如下图 /** * * @author Administrator * * 简单的多人聊天系统——重点:同时性,异步性 * 1.客户端:发送消息,并且接收消息 * 1.1 消息发送至服务器:服务器每次都将客户发过来的信息发送到每个客户端 * 1.2 接收消息:发送的同时也要接收消息,所以必须有两个线程,一个发送消息,一个接收消息 * 1.3 关于这两个线程:如果没有线程,接收和发送就是按顺序执行的了,那么是发送后接收还是接收后发送?或