Java Socket编写一个简单的Web服务器
程序员文章站
2024-03-20 16:22:22
...
Java Socket编写一个简单的Web服务器
(1)、使用 ServerSocket 监听某一端口,然后等待连接获取 Socket对象;
(2)、创建一个类 HttpServer 继承 java.lang.Thread 类,重写 run()方法,执行浏览器请求;
(3)、获得浏览器请求,解析资源文件路径;
(4)、读取资源文件,响应给浏览器;
(5)、浏览器地址栏输入: http://localhost:8000/index.html
首先你得创建一个html文件用于返回请求
1、继承Runnable类的代码如下
package TCPhtml;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class HtmlDemo {
public static void main(String[] args) throws IOException {
//首先创建套接字,使用ServerSocket监听8888端口
ServerSocket ss=new ServerSocket(8888);
while (true){
//侦听到要连接到此端口的套接字,并且接收它
Socket socket=ss.accept();
new Thread(new Runnable() { //开启一个线程
@Override
public void run() {
InputStream is= null; //初始化字节输入流对象
try {
is = socket.getInputStream(); //获取套接字的字节输入流对象
//将字节输入流读入到字符输入流,并传入字符输入流
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line=br.readLine(); //读取字符输入流的字符,每次读取一行
System.out.println(line); //这里打印出获得的请求,以便后面查错GET /NETDemo/Web/hello.html HTTP/1.1
String[] arr=line.split(" "); //将请求分解成请求方式、请求地址、请求码
String htmlpath=arr[1].substring(9); //得到请求的地址的相对地址,以便找到对应的html文件返回
FileInputStream fis=new FileInputStream(htmlpath);//找到文件并返回字节输入流对象
OutputStream os=socket.getOutputStream(); //获得套接字的字节输出流对象
// 写入HTTP协议响应头,固定写法,不写这个会报错
os.write("HTTP/1.1 200 OK\r\n".getBytes());
os.write("Content-Type:text/html\r\n".getBytes());
// 必须要写入空行,否则浏览器不解析
os.write("\r\n".getBytes());
//读取文件字节,并通过套接字,相当于返回本地文件到浏览器,那边自动解析文件字节输出流
int len=0;
byte [] bytes=new byte[1024];
while ((len=fis.read(bytes))!=-1){
os.write(bytes,0,len);
}
fis.close();
socket.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
然后浏览器输入本机IP地址和端口号,以及文件路径,就可以返回相应的文件内容
2、继承Thread类的
package TCPhtml;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class HttpServer extends Thread {
//首先创建套接字,使用ServerSocket监听8888端口
ServerSocket serverSocket = new ServerSocket(8888);
public HttpServer() throws IOException {
}
public void run() {//开启一个线程
while (true) {
try {
//侦听到要连接到此端口的套接字,并且接收它
Socket socket = serverSocket.accept();
//将字节输入流读入到字符输入流,并传入字符输入流
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str = bufferedReader.readLine();//读取字符输入流的字符,每次读取一行
System.out.println(str);//这里打印出获得的请求,以便后面查错GET /NETDemo/Web/hello.html HTTP/1.1
String path = str.split(" ")[1].substring(9);//将请求分解成请求方式、请求地址、请求码
FileInputStream fs = new FileInputStream(path);//得到请求的地址的相对地址,以便找到对应的html文件返回
OutputStream os = socket.getOutputStream();//获得套接字的字节输出流对象
// 写入HTTP协议响应头,固定写法
os.write("HTTP/1.1 200 OK\r\n".getBytes());
os.write("Content-Type:text/html\r\n".getBytes());
// 必须要写入空行,否则浏览器不解析
os.write("\r\n".getBytes());
//读取文件字节,并通过套接字,相当于返回本地文件到浏览器,那边自动解析文件字节输出流
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fs.read(bytes)) != -1) {
os.write(bytes, 0, len);
}
fs.close();
os.close();
socket.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
static class Start {
public static void main(String[] args) throws IOException {
HttpServer httpServer = new HttpServer();//创建HttpServer对象
httpServer.start(); //开启线程
}
}
}
推荐阅读
-
Java Socket编写一个简单的Web服务器
-
基于Java web服务器简单实现一个Servlet容器
-
基于Java web服务器简单实现一个Servlet容器
-
使用Java编写一个简单的Web的监控系统
-
使用Java编写一个简单的Web的监控系统
-
java使用socket实现一个多线程web服务器的方法
-
java使用socket实现一个多线程web服务器的方法
-
Java基于Socket实现简单的多线程回显服务器功能示例
-
Java基于Socket实现简单的多线程回显服务器功能示例
-
一个完整的混合加密方式在Socket客户机服务器通信应用中的例子 博客分类: java 应用服务器Socket正则表达式SecurityGmail