Skip to content

Instantly share code, notes, and snippets.

@zhhailon
Created March 18, 2016 19:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zhhailon/294f70f3108496c1dbe5 to your computer and use it in GitHub Desktop.
Save zhhailon/294f70f3108496c1dbe5 to your computer and use it in GitHub Desktop.
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();
}
}
@zhhailon
Copy link
Author

首先了解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页面。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment