In daily development, we have used many open-source web servers, such as tomcat and apache. Now we implement a simple web server. The basic function is to click the resource to be accessed, and the server sends the resource to the browser of the client. To simplify the operation, exceptions such as resource does not exist are not considered here. The web Service is based on the HTTP protocol. When you enter the address to be accessed in the address bar of your browser, it is critical for the server to obtain the address. Let's take a look at the common formats of HTTP request and response packets:
HTTP Request Message
HTTP Response Message
When the web server obtains a user's connection, a thread is initialized to communicate with the user. The Code is as follows:
Import java. io. dataInputStream; import java. io. file; import java. io. fileInputStream; import java. io. IOException; import java. io. printStream; import java.net. socket; // when each connection is established, the server separates the public class CommunicateThread extends Thread {// Socket client that communicates with the client; public CommunicateThread (Socket s) {client = s;} // obtain the path of the resource requested by the browser public String getResourcePath (String s) {// the first line of a general HTTP request message is "GET/index.html HTTP/1.1" // what we want to obtain is the "/indext. apsx "// obtain the resource location String s1 = s. substring (s. indexOf ('') + 1); s1 = s1.substring (1, s1.indexOf (''); // The ingress resource is index.html if (s1.equals ("") s1 = "index.html "; return s1;} public void sendFile (PrintStream out, File file) {try {DataInputStream in = new DataInputStream (new FileInputStream (file); int len = (int) file. length (); byte buf [] = new byte [len]; in. readFully (buf); // read the text into the buf array out. write (buf, 0, len); out. flush (); in. close ();} catch (Exception e) {System. out. println (e. getMessage (); System. exit (1) ;}} public void run () {try {// obtain the user's IP address and port number String clientIP = client. getInetAddress (). toString (); int clientPort = client. getPort (); // create the output stream object PrintStream out = new PrintStream (client. getOutputStream (); // create the input stream object DataInputStream in = new DataInputStream (client. getInputStream (); // read the request String msg = in. readLine (); // get the file path String fileName = getResourcePath (msg); System. out. println ("The user asked for resource:" + fileName); File file = new File (fileName); if (file. exists () {// set System Based on the Response Message format. out. println (fileName + "start send"); out. println ("HTTP/1.0 200 OK"); out. println ("mime_versions: 1.0"); out. println ("Content_Type: text/html"); int len = (int) file. length (); out. println ("Content_Length:" + len); out. println (""); // a blank line is required between the packet header and the information. // The sendFile (out, file); out. flush ();} client. close ();} catch (Exception e) {System. out. println (e. getMessage ());}}}
The server is mainly responsible for initializing sockets and threads. The Code is as follows:
Import java.net. serverSocket; import java.net. socket; public class WebServer {public static void main (String [] args) {int Port = 12345; // Port number, because this is a test, therefore, do not use common ports // create two sockets ServerSocket server = null; Socket client = null; try {server = new ServerSocket (Port); // The server starts to listen to System. out. println ("The WebServer is listening on port" + server. getLocalPort (); while (true) {client = server. accept (); // run new CommunicateThread (client) in multiple threads ). start () ;}} catch (Exception e) {System. out. println (e. getMessage ());}}}
Run the test:
Compile an index.html File
This is the index of my WebServer
Put it in the root directory of the project file, and enter "localhost: 12345/index.html" in the address bar of the browser to view the html file on the server. Note: because the server is an endless loop, restart the server and you will find that the specified port has been bound. You only need to go to the task manager and close the "Java (TM) Platfrom SE binary" process. The final result is as follows:
This server program is very simple and there is still much room for improvement. You can try to improve it on your own. Here, you can try to access other files and find the files are successful, which means the server is not safe.