Java 简单小型Web服务模型

简单Web服务

```java
/**
 * 功能:模拟web服务程序
 * 原理:java多线程、socket编程,TCP协议
 */

import java.io.*;
import java.net.*;

public class web_server{
    public static void main(String[] args) {
        int client_id = 1;              //初始化客户端id为1,client_id唯一标识一个socket和与其对应的一个java线程
        int PORT = 5000;                //该服务程序监听的端口
        ServerSocket server=null;       //服务端的serversocket
        Socket client=null;             //客户端socket
        try{
            server=new ServerSocket(PORT);     //实例化serverclient对象,监听5000端口。一个web服务器只需要一个serversocket
            System.out.println("Web Server is listening on port:"+server.getLocalPort());
            /*这里用到了一个无穷循环,让serversocket始终报纸监听,随时接受客户端程序的请求*/
            while(true) {
                client=server.accept(); //接受客户机的连接请求
                new ConnectionThread(client,client_id).start(); //为该client创建服务线程
                client_id++;//客户端标识加1
            }

        }catch(Exception e) {
            System.out.println(e);
        }
    }
}



/* 继承子Thread类,ConnnectionThread类完成与一个Web浏览器的通信 */
class ConnectionThread extends Thread {
    public Socket client = null; // 连接Web浏览器的socket字
    public int counter = 0; // 计数器
    public ConnectionThread(Socket cl , int c) {
        client=cl;
        counter=c;
    }

    @SuppressWarnings("deprecation")
    public void run()
    {
        try{
            String destIP=client.getInetAddress().toString(); // 客户机IP地址
            int destport=client.getPort(); // 客户机端口号
            System.out.println("Connection "+counter+":connected to "+destIP+" on port "+destport+".");
            PrintStream outstream=new PrintStream(client.getOutputStream());//获取与客户机的打印输出流
            DataInputStream instream=new DataInputStream(client.getInputStream());//获取从客户机的数据输入流
            String inline=instream.readLine(); // 读取Web浏览器提交的请求信息
            System.out.println("Received:"+inline);
            if (get_request_type(inline)) { // 如果是GET请求
                String filename=get_file_name(inline);
                File file=new File(filename);
                if (file.exists()) { // 若文件存在,则将文件送给Web浏览器
                    System.out.println(filename+" requested.");
                    //发送HTML的head信息
                    outstream.println("HTTP/1.0 200 OK");
                    outstream.println("MIME_version:1.0");
                    outstream.println("Content_Type:text/html");
                    int len=(int)file.length();
                    outstream.println("Content_Length:"+len);
                    outstream.println("");
                    //发送HTML正文信息
                    sendfile(outstream,file); // 发送文件
                    //清空输出流
                    outstream.flush();
                } else { // 文件不存在时
                    String filenam="error.html";
                    //得到错误信息页面
                    File file1=new File(filenam);
                    System.out.println(filename+" requested.");
                    //输出HTML的头信息
                    outstream.println("HTTP/1.0 200 OK");
                    outstream.println("MIME_version:1.0");
                    outstream.println("Content_Type:text/html");
                    int len=(int)file.length();
                    outstream.println("Content_Length:"+len);
                    outstream.println("");
                    //输出错误信息文件
                    sendfile(outstream,file1); // 发送文件
                    //清空缓冲区
                    outstream.flush();
                }
            }
            //设置延时,等待文件传送完毕
            long m1=1;
            while (m1<11100000)
            {
                m1++;
            }
            //关闭客户端socket
            client.close();

        }catch(IOException e) {

            System.out.println("Exception:"+e);
        }
    }


    /* 获取请求类型是否为“GET” */

    boolean get_request_type(String s) {
        if (s.length()>0)
        {
            if(s.substring(0,3).equalsIgnoreCase("GET"))
                return true;
        }
        return false;
    }

    /* 获取要访问的文件名 */
    String get_file_name(String s) {
    /*get请求的第一行信息格式为:“GET /books/?name=Professional%20Ajax HTTP/1.1”
      String.substring(int i)方法是从第i个字符开始取,取出后面所有的字符
      String.substring(int begin,int end)方法是取出从begin到end的所有字符
      */
        String file_name = s.substring(s.indexOf(' ')+1);//这一条是把get后面所有的字符串取出来
        file_name = file_name.substring(0,file_name.indexOf(' '));
        try{
            if(file_name.charAt(0)=='/')
                file_name=file_name.substring(1);
        }catch(StringIndexOutOfBoundsException e) {
            System.out.println("Exception:"+e);
        }
        if (file_name.equals("")) {
            file_name="index.html";
        }
        return file_name;
    }

    /*把指定文件发送给Web浏览器 */

    void sendfile(PrintStream outs,File file){
        try{
            DataInputStream in=new DataInputStream(new FileInputStream(file));
            int len=(int)file.length();
            byte buf[]=new byte[len];
            in.readFully(buf);
            outs.write(buf,0,len);
            outs.flush();
            in.close();
        }catch(Exception e){
            System.out.println("Error retrieving file.");
            System.exit(1);
        }
    }
}

//网络素材仅限收藏 方便学习

posted @ 2021-06-07 16:12  New_HackerHK  阅读(107)  评论(0编辑  收藏  举报