⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webserver.java

📁 一个简单的HTTP服务器和HTTP客户端程序 HTTP客户端(即浏览器)只支持显示标准HTML
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package web.http.server;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.io.RandomAccessFile;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;

public class WebServer extends Thread
{

    /**
     * HTTP协议的端口
     */
    private int PORT = 80;

    /**
     * HTTP协议的服务器端
     */
    private ServerSocket server = null;

    /**
     * 用户数目
     */
    private int userNumber = 1;

    /**
     * 服务的路径 从配置文件中读取 配置文件为简单ini 类型
     */
    private String serverPath = null;

    /**
     * 日志记录,记录一些客户访问信息
     */
    private RandomAccessFile infoLog = null;

    /**
     * 日志记录,记录错误信息
     */
    private RandomAccessFile errorLog = null;

    /**
     * 显示系统错误时,弹出窗口时需要的容器:界面窗口
     */
    private JComponent parentComponent = null;

    /**
     * 显示提示信息的窗口
     */
    private JTextArea taInfo = null;

    public static void main(String args[])
    {
        new WebServer().startServer();
    }

    /**
     * 开启WEB服务
     */
    public void startServer()
    {
        try
        {
            //获取配置信息,并进行初始化
            getServerInfo();
            server = new ServerSocket(PORT);
            info("服务器开启,在" + PORT + "端口提供服务!");
            this.start();//主线程启动
        } catch (IOException ioe)
        {
            sysError("建立服务时发生IO错误:" + ioe.getMessage());
        } catch (Exception e)
        {
            e.printStackTrace();
            sysError("发生非预见性错误,无法启动服务:" + e.getMessage());

        }
    }
    /**
     * 提供服务的主线程
     * 监听用户请求,提供WEB服务
     */
    public void run()
    {
        try
        {
            //无限监听用户请求
            while (server!=null)
            {
                Socket client = server.accept();
                //每连接一个客户,都构造一个内部类ServerThread,然后运行
                new ServerThread(client).start();
            }
        }catch (Exception e)
        {
            e.printStackTrace();
            sysError("连接客户发生错误:" + e.getMessage());

        }
    }

    /**
     * 关闭服务器
     *
     */
    public void stopServer()
    {
        try
        {
            if(this.isAlive())
                this.stop();
            if (this.server != null)
                server.close();
            server=null;
            info("服务器关闭");
        } catch (Exception e)
        {
            info("无法关闭服务:" + e.getMessage() + ",将会强制退出系统");
            System.exit(0);
        }
    }

    /**
     * 读取文件 获取服务路径 并对日志文件进行初始化
     */
    private void getServerInfo()
    {
        try
        {
            //获取当前路径
            File nowdir = new File(".").getAbsoluteFile();
            String dirString = nowdir.toString();
            String subs = dirString.substring(0, dirString.length() - 1);
            File fileInfo = new File(subs + "info/");
            if (!fileInfo.exists())
                fileInfo.mkdir();

            //打开记录客户服务的日志文件
            File logFile = new File(fileInfo, "server.log");
            infoLog = new RandomAccessFile(logFile, "rw");
            infoLog.seek(infoLog.length());

            //打开记录错误信息的日志文件
            File errorFile = new File(fileInfo, "error.log");
            errorLog = new RandomAccessFile(errorFile, "rw");
            errorLog.seek(errorLog.length());

            //获取服务路径
            File serverInfo = new File(fileInfo, "info.ini");
            FileReader fr = new FileReader(serverInfo);
            BufferedReader br = new BufferedReader(fr);
            serverPath = br.readLine();
            if ((serverPath == null) || serverPath.trim().equals(""))
                serverPath = nowdir.toString();//默认为当前路径

            fr.close();
            br.close();
        } catch (FileNotFoundException fnfe)
        {
            sysError("无法找到文件:" + fnfe.getMessage());
        } catch (IOException ioe)
        {
            sysError("打开文件过程中发生IO错误:" + ioe.getMessage());
        } catch (Exception e)
        {
            sysError("非预知错误:" + e.getMessage());
        }
    }

    /**
     * 记录服务信息
     * 
     * @param info
     */
    private void info(String info)
    {
        try
        {
            if (infoLog != null)
            {
                Date today = new Date();
                //格式化日期
                SimpleDateFormat formatter = new SimpleDateFormat("20yy:MM:dd hh:mm: ");
                String dateString = formatter.format(today);
                if (taInfo != null)//输出信息到窗口
                    taInfo.append((dateString + info) + "\n");
                //输出信息到文件
                infoLog.write((dateString + info).getBytes());
                infoLog.writeByte(13);
                infoLog.writeByte(10);
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    /**
     * 一般性错误 提供错误日志记录
     * 
     * @param errorInfo
     */
    private synchronized void error(String errorInfo)
    {
        try
        {
            if (errorLog != null)
            {
                Date today = new Date();
              // 格式化日期
                SimpleDateFormat formatter = new SimpleDateFormat("20yy:MM:dd hh:mm: ");
                String dateString = formatter.format(today);
                if (taInfo != null)//输出信息到窗口
                    taInfo.append((dateString + errorInfo) + "\n");
               //输出信息到文件
                String s = (dateString + ":" + errorInfo);
                errorLog.write(s.getBytes());
                errorLog.writeByte(13);
                errorLog.writeByte(10);
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    /**
     * 严重错误 提供错误日志记录 发生该类错误后出现提示信息 然后退出服务器
     * 
     * @param errorInfo
     */
    private synchronized void sysError(String errorInfo)
    {
        String s = errorInfo + "  ->服务器将会退出运行!";
        error(errorInfo);
        if (this.parentComponent != null)
            JOptionPane.showMessageDialog(this.parentComponent, s);
        System.exit(0);
    }

    /**
     *  设置显示信息需要的容器
     * @param parentComponent
     */
    public void setParentComponent(JComponent parentComponent)
    {
        this.parentComponent = parentComponent;
    }
    /**
     * 设置显示服务信息的文本框
     * @param taInfo

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -