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);
}
}
}
//网络素材仅限收藏 方便学习