Socket模拟网站服务器

package javaWeb;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class MyHttpServer
{


public static void main(String[] args)
{
try
{
ServerSocket serverSocket = new ServerSocket(8080);
//http协议如果使用的端口不是默认的80端口的话,在访问时要使用http://127.0.0.1:8080这种格式
while (true)
{
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
InputStreamReader reader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(reader);
String line = bufferedReader.readLine();// 读取Http请求第一行
System.out.println(line);
if (line == null)// 偶尔line也会为null
{
bufferedReader.close();
reader.close();
inputStream.close();
continue;
}
System.out.println("客户端请求是" + line);//当日志使用
String fileName = line.split(" ")[1]; //从GET /2.html HTTP/1.1 的到请求的文件
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
//报文头
outputStreamWriter.write("HTTP/1.1 200 OK\r\n");
outputStreamWriter.write("\r\n");//表示我采用的是1.1的HTTP协议
outputStreamWriter.flush();
//根据用户的请求 GET /add?i=9&j=8 HTTP/1.1 动态的响应
if (fileName.contains("?"))
{
if (fileName.startsWith("/add?"))
{
//正则表达式“非贪婪模式”
Pattern pattern = Pattern.compile("GET /(.+?)\\?i=(\\d+)&j=(\\d+) HTTP/1.1");
Matcher matcher = pattern.matcher(line);
if (matcher.find())
{
int i = Integer.parseInt(matcher.group(2));//group()不带参数表示整体,带参数表示整体中的局部
int j = Integer.parseInt(matcher.group(3));
outputStreamWriter.write("<html><head></head><body>");
outputStreamWriter.write(i + "+" + j + "=" + (i + j));
outputStreamWriter.write("</body></html>");
outputStreamWriter.flush();
}
} else if (fileName.startsWith("/login?"))
{
Pattern pattern = Pattern.compile("userName=(.+?)&passWord=(.+?) HTTP/1.1");
Matcher matcher = pattern.matcher(line);
System.out.println(matcher.find());
if (matcher.find())
{
String username = matcher.group(1);
String password = matcher.group(2);
outputStreamWriter.write("<html><head></head><body>");
if (username.equals("admin") & password.equals("123"))
{
outputStreamWriter.write("登陆成功");
} else
{


outputStreamWriter.write("登陆失败");


}
outputStreamWriter.write("</body></html>");
outputStreamWriter.flush();
}
//案例:table显示所有的用户信息
} else if (fileName.startsWith("/showinfo?"))
{
outputStreamWriter.write("<html>\r\n");
outputStreamWriter.write("<head></head>\r\n");
outputStreamWriter.write("<body>\r\n");
outputStreamWriter.write(
"<table><thead><tr><td>Id</td><td>account</td><td>Password</td></tr></thead>\r\n");
outputStreamWriter.write("<tbody>\r\n");
try
{
ResultSet resultSet = JdbcCUtils.executeQurey("select * from t_user");
while (resultSet.next())
{
String id = resultSet.getString("id");
String account = resultSet.getString("account");
String password = resultSet.getString("password");
outputStreamWriter.write("<tr><td>" + id + "</td><td>" + account + "</td><td>"
+ password + "</td></tr>");
}


} catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
outputStreamWriter.write("</tbody></table>\r\n");
outputStreamWriter.write("</body></html>\r\n");
}
} else
{
//报文体
// 拼文件的全路径
File file = new File("D:\\webstorm9\\webstormWorkspace\\DOM", fileName);
// 因为编码的问题 最好使用英文字符  
// 或者在写出流中设置编码OutputStreamWriter osw = new OutputStreamWriter(os, "gbk");
// 如果是文件,并且存在,就把文件内容返回
if (file.exists() && file.isFile())
{
InputStream inputStream2 = new FileInputStream(file);
copy(inputStream2, outputStream);
inputStream2.close();
} else
{
outputStreamWriter.write("HTTP/1.1 404 NOTFOUND\n");
outputStreamWriter.write("没有找到");
}
}
outputStreamWriter.flush();
socket.close();
outputStreamWriter.close();
outputStream.close();
//outputStream、client等这些必须被关闭,如果你放到else就不是必须会被关闭呀
}
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}


/**
* 所有数据本质上都是字节形式的,使用字节流复制不会出问题,倒是使用字符流可能会损坏数据
* 流的对拷
* @param inputStream
* @param outputStream
* @throws IOException
*/
static void copy(InputStream inputStream, OutputStream outputStream) throws IOException
{
byte[] bytes = new byte[1024];//btyes变量用作缓冲区,使用循环从读取流里面读取数据写入输出流
int len;
while ((len = inputStream.read(bytes)) > 0)
{
outputStream.write(bytes, 0, len);
}


}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值