Java基础教程——模拟B/S结构的服务器

浏览器发送请求,用Java模拟写个简单的服务器,浏览器可以收到响应。

执行下列代码(设置static final int TEST = 1),

使用浏览器访问:http://127.0.0.1:8888/tigerlion/index.html

服务器会打印如下代码,这就是浏览器请求的内容:

GET /tigerlion/index.html HTTP/1.1
Accept: text/html, application/xhtml+xml, image/jxr, /
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: 127.0.0.1:8888
Connection: Keep-Alive

第一句反应了请求访问的资源信息,找到响应文件,返回给请求放即可(设置static final int TEST = 0)。

import java.net.*;
import java.io.*;
public class SocketBS {
	// 使用IE访问:http://127.0.0.1:8888/tigerlion/index.html
	static final int TEST = 1;// 1:输出请求内容/其它:接受请求并响应
	public static void main(String[] args) {
		try {
			ServerSocket sSocket = new ServerSocket(8888);
			while (true) {
				System.out.println("accept:");
				Socket s = sSocket.accept();
				InputStream ips = s.getInputStream();
				if (TEST == 1) {
					// 测试请求内容
					byte[] b = new byte[1024];
					ips.read(b);
					System.out.println(new String(b));
				} else {
					// 使用缓冲流,读取一行,并进行解析
					BufferedReader br = new BufferedReader(new InputStreamReader(ips));
					// |--获取首行
					String firstLine = br.readLine();
					// |--按空格分割
					String[] request = firstLine.split(" ");
					// |--0是GET,1是路径
					String requestPage = request[1];
					System.out.println("用户请求的资源是:" + requestPage);
					// 根据用户请求的资源,找到服务器上的文件,发送给用户
					OutputStream os = s.getOutputStream();
					// HTML协议响应头(固定写法)
					os.write("HTTP/1.1 200 OK\r\n".getBytes());
					os.write("Content-TYpe:text/html\r\n".getBytes());
					os.write("\r\n".getBytes());
					// 写网页(应该是从服务器上读文件并写入,此处简化)
					os.write("<HTML><a href='https://zhuanlan.zhihu.com/hulaoshi'>Story of Computer</a></HTML>"
							.getBytes());
					os.close();
					br.close();
				}
				ips.close();
				s.close();
			}
			// sSocket.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			System.out.println("服务器端,OVER");
		}
	}
}
posted @ 2019-07-14 00:35  虎老狮  阅读(465)  评论(0编辑  收藏  举报