1. 程式人生 > >自己的web伺服器專案-實現多執行緒處理(三)

自己的web伺服器專案-實現多執行緒處理(三)

上面專案中,伺服器只能接受單方的請求,不能夠多使用者同時訪問,這明顯不符合現實邏輯,那麼在這裡,我們將其修改為多執行緒的,實現多使用者的訪問

首先,我們實現Server類如下:

package com.sapmle.server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import com.sample.utils.ServerPortUtils;
public class Server {
	public static void main(String[] args) {
		//宣告變數
        ServerSocket ss=null;
        Socket s=null;
        boolean flag=true;
        	int port=Integer.valueOf(ServerPortUtils.getPortValue("serverPort"));
        	int i=1;
        	System.out.println("Server Port:"+port);
			try {
				ss=new ServerSocket(port);
				while(flag)
				{
					//接受客戶端傳送過來的Socket
					s=ss.accept();
					System.out.println("accept count:"+i++);
					ServerThread st=new ServerThread(s);
					st.start();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
	}
注意:在實現int port=Integer.valueOf(ServerPortUtils.getPortValue("serverPort"));時同樣使用了properties檔案進行埠的配置,參照前面自己配置。

程式碼中,while(true)為保持伺服器端一直處於監聽狀態,st.start()啟動執行緒

下面就是執行緒類的實現:

package com.sapmle.server;
import java.net.Socket;
import com.sample.http.HttpAccessProcessor;
import com.sample.http.HttpCreatorImpl;
import com.sample.http.HttpRequest;
import com.sample.http.HttpResponse;
public class ServerThread extends Thread {
	private Socket s;
	public ServerThread(Socket s) {
		this.s=s;
	}
        @Override
        public void run() {
        	HttpCreatorImpl hci=new HttpCreatorImpl(s);
			HttpRequest request=hci.getHttpRequest();
			System.out.println(request.getProtocol());
			HttpResponse response=hci.getHttpResponse();
			HttpAccessProcessor hapi=hci.getHttpAccessProcessor();
			if(request.isStaticResource())
			{
				hapi.processStaticResource(request, response);
			}
			else if(request.isDynamicResource())
			{
				hapi.processDynamicResource(request, response);
			}
			else
			{
				System.out.println("無法處理");
				hapi.sendError(404, request, response);
			}
        }
}
這樣的話,我們就完成了類似於伺服器端Servlet的功能,能夠同時處理html頁面和Servlet頁面,最重要的是多使用者同時訪問哦。。。,效果這兒就不展示了,你可以將自己的電腦作為伺服器,然後使用區域網中的多臺電腦進行訪問,由於程式碼中含有很多提示資訊,所以控制檯上會有列印,如下是我的控制檯介面: