📄 webserver.java
字号:
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 + -