標籤:

三步搭建伺服器

搭建一個聊天伺服器其實 很簡單,在這裡我將其分為三步:

第一步,創建一個伺服器,及實例化一個ServerSocket對象server,在這一部中要注意的就是在實例化ServerSocket對象的時候要有個埠參數,是一個0~65535的整型數據,此時要注意異常的處理。

第二步,等待客戶端連接,即創建一個Socket對象,使用語句Socket client = server.accept();此時程序會進入「待機」狀態,直到有客戶機連接。

第三步,發送消息,當一個客戶機連上伺服器後就要面臨收發消息這個問題,我們通過對輸入輸出流對象的處理來解決這一問題。首先實例化輸入輸出流對象,使用語句InputStream ins = client.getInputStream();OutputStream ous = client.getOutputStream();當我們獲得輸入輸出流對象後,我們只要通過read()和write()函數來讀和寫就可以了。在這裡要注意的一個問題就是,其實我們每次發送消息時,發送的都是字元串所對應的字元串數組。因此,我們要先用getBytes()方法得到字元串所對應的字元串數組,然後用write()方法進行寫。

到此,一個簡單的伺服器就搭建好了,當然,在這個伺服器中還存在非常多的漏洞,下面讓我們再來對這個簡單的伺服器再升級一下。

首先,我們當然不希望我們的伺服器只能連接一次客戶機,然後就關閉,就像我們不允許我們的手機每次再接到一個來電後就關機,這是一個讓人頭疼的問題。那麼,我們就要讓伺服器不斷地進入等待,因此,我們可以將等待客戶機連接這一步放入一個死循環中,這樣,在一個客戶機脫離鏈接後,伺服器將不會出現「關機」現象。

其次,我們當然也希望我們的伺服器可以被多個客戶同時連接,這個想法是可行的,就像我們好幾個人可以同時撥打10086進行通話一樣。那麼我們怎樣才能讓我們的伺服器能同時連上幾個客戶機呢,我們想到了線程。我們用線程去處理客戶機的鏈接。每當有客戶機來連接伺服器時,我們就開闢一個線程去處理它。

在這裡,我們先用windows系統自帶的原始客戶端進行測試,只需在控制面版中輸入cmd打開命令窗口,然後輸入「telnet localhost + 埠號 」就可以連上自己搭建的伺服器了,要想連接另外一台電腦的伺服器,輸入「telnet + 對方的IP地址+伺服器埠號」。

到這一步,我們已經能做到好幾個客戶機同時連上伺服器了,那麼,我們又要想了,這麼多個客戶機之間怎麼樣才「溝通」呢。我們下一篇接著分享。

package socket1014;import java.io.IOException;/** * 用線程去處理客戶機的鏈接,實現多個客戶機與伺服器的通信 * @author Sam * */public class SocketThread extends Thread{ private java.net.Socket client; private java.io.OutputStream ous; private java.io.InputStream ins; //str表示伺服器向客戶機發送的字元串,inputSting表示要讀寫的輸入字元串,user表示用戶名,password表示密碼 private String str,inputString,user,password; private byte[] data; //構造函數,傳入一個client public SocketThread(java.net.Socket client){ this.client = client; } //發送信息的方法 public void sendMessage(String message) throws IOException{ data = message.getBytes(); ous.write(data); ous.flush(); } //重寫線程中的run方法,用線程去處理客戶機的鏈接 public void run(){ try { handlC(this.client); } catch (IOException e) { e.printStackTrace(); } } public void handlC(java.net.Socket client) throws IOException{ ous = client.getOutputStream(); ins = client.getInputStream(); str = "歡迎來到小波哥創建的伺服器
"
; //每當有一個客戶機連接時,就顯示出歡迎語 data = str.getBytes(); ous.write(data); ous.flush(); //強制輸出 do{ str = "請輸入用戶名:"; data = str.getBytes(); ous.write(data); ous.flush(); // user = readInput(this.client); }while(!user.equals("poe")); do{ str = "請輸入密碼:"; data = str.getBytes(); ous.write(data); ous.flush(); // password = readInput(this.client); }while(!password.equals("123")); //輸對用戶名和密碼後才能進行下面的工作 str = "歡迎poe進入,您現在可以進行聊天了"; data = str.getBytes(); ous.write(data); ous.flush(); inputString = readInput(this.client); System.out.println("客戶機:"+inputString); while(!inputString.equals("bye")){ data = ("伺服器收到:"+inputString).getBytes(); ous.write(data); ous.flush(); inputString = readInput(this.client); } System.out.println("客戶機:bye"); str = "bye,歡迎下次再來"; data = str.getBytes(); ous.write(data); ous.flush(); ous.close(); } public String readInput(java.net.Socket client) throws IOException{ //先實例化一個字元串緩衝區 StringBuffer sb = new StringBuffer(); char c = 0; while(c != 13){ int i = ins.read(); c = (char)i; sb.append(c); } inputString = sb.toString().trim(); return inputString; } public void startSock(int port){ try { java.net.ServerSocket ss = new java.net.ServerSocket(port); System.out.println("成功創建伺服器:"+port); while(true){ client = ss.accept(); SocketThread t = new SocketThread(client); t.start(); System.out.println("已經啟動一個線程去處理客戶機的鏈接"); } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[]args){ SocketThread st = new SocketThread(null); st.startSock(6060); }}

推薦閱讀:

《絕地求生大逃殺》亞服伺服器選哪個啊?
搬瓦工VPS註冊購買常見問題基礎小白版!
西部數碼虛擬主機和大宇雲的哪個好,各有什麼特色呢?
OPNFV在雙網卡物理機群上的部署(FUEL)

TAG:伺服器 |