📄 webserver.java
字号:
//WebServer.java 用JAVA编写Web服务器
import java.io.*;
import java.math.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.*;
public class WebServer extends JFrame
{
static JTextField tf1,tf2,tf3,tf4;
static JTextArea ta1;
static boolean statusFlag=false;
JPanel pu,pd,pw,pe,pc,pdw,pdc,pde;
String[] string={"启动服务","终止服务"};
JButton[] button=new JButton[2];
JLabel lb1,lb2,lb3,lb4,lb5;
public WebServer(){
super("WEB服务器");
EventHandler handler=new EventHandler();
getContentPane().setLayout(new BorderLayout());
pu=new JPanel();
tf1=new JTextField(18);
tf1.setText("d:\\s\\");
tf2=new JTextField(4);
tf2.setText("80");
lb1=new JLabel("设置主目录:");
lb2=new JLabel("端口号:");
// tf1.setHorizontalAlignment(JTextField.RIGHT); //右对齐
// lb1.setBorder(BorderFactory.createLoweredBevelBorder());//标签凹陷效果
pu.add(lb1);
pu.add(tf1);
pu.add(lb2);
pu.add(tf2);
pd=new JPanel();
pd.setLayout(new FlowLayout());
lb3=new JLabel("服务器状态:");
lb4=new JLabel("未运行");
lb4.setBorder(BorderFactory.createLoweredBevelBorder());//标签凹陷效果
lb5=new JLabel(" ");
button[0]=new JButton(string[0]);
button[1]=new JButton(string[1]);
pdw=new JPanel();
pdc=new JPanel();
pde=new JPanel();
pdw.add(lb3);
pdw.add(lb4);
pdc.add(lb5);
pde.add(button[0]);
pde.add(button[1]);
pd.add("WEST",pdw);
pd.add("CENTER",pdc);
pd.add("EAST",pde);
button[0].addActionListener(handler);
button[1].addActionListener(handler);
pc=new JPanel();
pc.setBorder(BorderFactory.createEmptyBorder(5,10,10,10));
// ta1=new JTextArea(" ",10,1);
ta1 = new JTextArea(){
public void append(String str) {
super.append(str);
this.setCaretPosition(getDocument().getLength());
}
};
pc.add(ta1);
pe=new JPanel();
pw=new JPanel();
// pe.setBorder(BorderFactory.createEmptyBorder(5,10,10,10));
// pw.setBorder(BorderFactory.createEmptyBorder(5,10,10,10));
getContentPane().add("North",pu);
getContentPane().add("South",pd);
getContentPane().add("Center",pc);
getContentPane().add("West",pw);
getContentPane().add("East",pe);
this.getContentPane().add(new JScrollPane(ta1),BorderLayout.CENTER); //添加滚动条
// this.setCaretPosition(getDocument().getLength());
setSize(405,350);
setVisible(true);
setResizable(false);
}
/*在textarea里添加信息*/
public static void printString(String s){
ta1.append(" "+s+"\n");
}
/*返回状态信息*/
public static boolean serverStatus(){
return statusFlag;
}
/*返回文件夹信息*/
public static String getFilePath(){
String filepath;
return(filepath=tf1.getText());
}
/*事件处理程序*/
class EventHandler implements ActionListener{
public void actionPerformed(ActionEvent event){
String sCommand=event.getActionCommand();
/*当用户按下了'启动服务'键*/
if((JButton)event.getSource()==button[0]){
lb4.setText("运行中");
if(!statusFlag)
{
System.out.println("服务器启动!");
ta1.append(" 服务器启动!\n");
}
statusFlag=true;
}
/*当用户按下了'终止服务'键*/
if((JButton)event.getSource()==button[1]){
lb4.setText("未运行");
if(statusFlag)
{
System.out.println("服务器停止运行");
ta1.append(" 服务器停止运行 !!!!!\n\n");
}
statusFlag=false;
}
}
}
public static void main(String args[])
{
WebServer myWebServer=new WebServer();
myWebServer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int i=1, PORT;
ServerSocket server=null;
Socket client=null;
while(!statusFlag){}
try
{
for(;;)
{
while(!statusFlag){}
if((tf2.getText()).length()==0)
PORT=8080;
else
PORT=Integer.valueOf(tf2.getText()).intValue();
server=new ServerSocket(PORT);
System.out.println("服务器正监听端口: "+server.getLocalPort());
ta1.append(" 服务器正监听端口:"+server.getLocalPort()+"....................\n\n");
for (;;)
{
if(statusFlag){
client=server.accept(); //接受客户机的连接请求
if(statusFlag)
{
new ConnectionThread(client,i).start();
i++;
}
}
else{
// try{
// Thread.currentThread().sleep(100);
// }catch(InterruptedException e){}
break;
}
}
// System.out.println("Web Server stoped servering");
// ta1.append("Web Server stoped servering\n");
}
}
catch (Exception e) {System.out.println(e);}
}
}
/* ConnnectionThread类完成与一个Web浏览器的通信 */
class ConnectionThread extends Thread
{
Socket client; //连接Web浏览器的socket字
int counter; //计数器
public ConnectionThread(Socket cl,int c)
{
client=cl;
counter=c;
}
public void run() //线程体
{
if(WebServer.serverStatus())
{
try
{
String destIP=client.getInetAddress().toString(); //客户机IP地址
int destport=client.getPort(); //客户机端口号
System.out.println("Connection "+counter+":connected to "+destIP+" on port "+destport+".");
WebServer.printString("连接 "+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);
WebServer.printString("Received:"+inline);
if (WebServer.serverStatus()&&getrequest(inline))
{ //如果是GET请求
String filename=WebServer.getFilePath().concat(getfilename(inline));
File file=new File(filename);
if (WebServer.serverStatus()&&file.exists())
{ //若文件存在,则将文件送给Web浏览器
System.out.println(filename+" requested.");
WebServer.printString(filename+" requested.");
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,file); //发送文件
outstream.flush();
}
else
{ //文件不存在时
String msg1="<html><head><title>Not Found</title></head><body><h1>Error 404-file not found</h1></body></html>";
System.out.println(filename+" 未找到.");
WebServer.printString(filename+" 未找到!");
outstream.println("HTTP/1.0 404 no found");
outstream.println("Content_Type:text/html");
outstream.println("Content_Length:"+msg1.length()+2);
outstream.println("");
outstream.println(msg1);
outstream.flush();
}
}
//instream.close();
//outstream.close();
long m1=1; //延时
while (m1<11100000) {m1++;}
client.close();
}
catch (IOException e)
{
System.out.println("Exception:"+e);
}
}
}
/* 获取请求类型是否为“GET” */
boolean getrequest(String s)
{
if (s.length()>0)
{
if (s.substring(0,3).equalsIgnoreCase("GET")) return true;
}
return false;
}
/* 获取要访问的文件名 */
String getfilename(String s)
{
String f=s.substring(s.indexOf(' ')+1);
f=f.substring(0,f.indexOf(' '));
try
{
if (f.charAt(0)=='/')
f=f.substring(1);
}
catch (StringIndexOutOfBoundsException e)
{
System.out.println("Exception:"+e);
}
if (f.equals("")) f="index.html";
return f;
}
/*把指定文件发送给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);
/*
DataOutputStream ou=new DataOutputStream(System.out);
ou.write(buf,0,len);
*/
outs.flush();
in.close();
}
catch (Exception e)
{
System.out.println("Error retrieving file.");
System.exit(1);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -