Created
March 18, 2016 19:06
-
-
Save zhhailon/294f70f3108496c1dbe5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.net.*; | |
import java.io.*; | |
/** | |
* A very simple web server. | |
* @author zhhailon | |
*/ | |
public class MiniWebServer { | |
protected void start() { | |
ServerSocket s; | |
System.out.println("MiniWebServer starting up on port 8080"); | |
System.out.println("(press ctrl-c to exit)"); | |
try { | |
// 创建服务器端socket | |
s = new ServerSocket(8080); | |
} catch (Exception e) { | |
System.out.println("Error: " + e); | |
return; | |
} | |
System.out.println("Waiting for connection"); | |
for (;;) { | |
try { | |
// 等待连接 | |
Socket remote = s.accept(); | |
// accept()返回一个连接的socket,即客户端 | |
System.out.print("Connection, sending data."); | |
// 还记得BufferedReader吗,按行读入 | |
BufferedReader in = new BufferedReader( | |
new InputStreamReader(remote.getInputStream())); | |
// 还记得PrintWriter吗,按行写出 | |
PrintWriter out = new PrintWriter(remote.getOutputStream()); | |
// 读取数据,我们将忽略读取的内容,直到读到一个空行 | |
// 记住HTTP头是以一个空行标示结束的,我们不关心它的内容 | |
String str = "."; | |
while (!str.equals("")) { | |
str = in.readLine(); | |
} | |
// 发送响应 | |
// 发送HTTP头 | |
out.println("HTTP/1.0 200 OK"); | |
out.println("Content-Type: text/html"); | |
out.println("Server: SimpleWebServer"); | |
// 别忘了一个空行 | |
out.println(""); | |
// 发送HTML页面 | |
out.println("OK, I'm the ugly page.. Welcome.."); | |
// flush()确保所有数据都传送出去了 | |
out.flush(); | |
// 关闭连接 | |
remote.close(); | |
} catch (Exception e) { | |
System.out.println("Error: " + e); | |
} | |
} | |
} | |
/** | |
* | |
* @param args | |
*/ | |
public static void main(String[] args) { | |
MiniWebServer ws = new MiniWebServer(); | |
ws.start(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
首先了解Java socket。Java定义了两个十分重要的类:SocketServer和Socket。从它们的名字就可以看出它们各自的用途。 SocketServer用于作为服务器端的程序,Socket用于链接服务器的客户端程序。需要注意的是,这两个类只有在连接初始的时候有所区别,当连 接一旦建立,服务器端和客户端就是两个对等的实体,两端都可以读和写。
所有的读操作都是由InputStream类来完成,所有的写操作都是有OutputStream类来完成。但是这两个类都是比较低级的类,它们只负责字节流的传输。因此很少直接使用它们来读写数据。
对于输入流(InputStream)有两个常用的类:DataInputStream和BufferedReader。其中DataInputStream用于从socket流中读二进制数据,例如16位或者32位整数。BufferedReader则是按行读取。
对于输出流(OutputStream)同样有两个常用类:DataOutputStream和PrintWriter,它们分别对应于输入流的两个类,一个是写二进制数据,一个是按行写数据。
下面简单了解一下HTTP协议(Hypertext Transfer Protocol)。首先需要明白,HTTP包分两部分,header和body,它们之间用一个空行分割开来。请求有几种方式,比如GET,POST, 就不赘述了,需要详细了解的可以翻看相关书籍或直接阅读RFC。
基础知识就是这些,下面可以进行一点编程工作。
以下将要编写一个十分十分简单的web server,不论客户端的请求是什么,它只返回一个十分十分简单的HTML页面。