1. 程式人生 > 實用技巧 >軟體工程-黃金點遊戲 21組 第10、11周

軟體工程-黃金點遊戲 21組 第10、11周

一、迭代開發的方向思考討論

我們在瞭解了下一步的課程設計要求後,就我們的黃金點遊戲開發方向進行了相關的思考,開始,我們提出了網頁程式、微信小程式和電腦可互動程式三個迭代開發的方向,但是結合我們兩人的已有的開發經驗和程式碼能力,最終選擇了可互動的電腦程式來進行迭代開發,放棄網頁是因為對於網頁的前端介面優化的JavaScript語言兩個人都並不是很瞭解,而微信小程式方向上,雖然吳同學具有微信小程式的開發經驗,但是對於如何開發一個遊戲型別的小程式也覺得有一些困難,不便於實現兩個使用者的互動,因此我們最終選擇在已有程式碼上迭代開發可互動的電腦程式。

二、可互動電腦程式開發

1.開發思路

由於我們前期的控制檯程式以及具有UI圖形介面的程式均是用Java語言編寫的,因此我們實現互動的方式是基於Java的socket程式設計。

2.開發原理

socket是BSD UNIX的通訊機制,通常稱為“套接字”,其英文原意是“孔”或“插座”。顧名思義,socket正如其英文原意一樣,像是一個多孔插座,可以提供多個埠的連線服務。對於伺服器來說,伺服器先初始化socket,然後埠繫結(bind),再對埠監聽(listen),呼叫accept阻塞,等待客戶端連線請求。對於客戶端來說,客戶端初始化socket,然後申請連線(connection)。客戶端申請連線,伺服器接受申請並且回覆申請許可,然後傳送資料,最後關閉連線,完成一次互動過程。

3.基於Java的開發實踐

(1)建立客戶端Socket,指定伺服器IP地址和埠,獲取輸出流,向伺服器端傳送資訊。

(2)由系統標準輸入裝置構造BufferedReader物件,由Socket物件得到輸出流,並構造PrintWriter物件

(3)獲取輸入流,並讀取伺服器端的響應資訊

(4)由Socket物件得到輸入流,並構造相應的BufferedReader物件,從系統標準輸入讀入一字串,將此字串輸出到Server端,重新整理輸出流,是伺服器端接收到此字串。

(5)關閉輸入流、輸出流和socket。

三、實現互動的伺服器,客戶端程式碼及執行截圖

1.程式碼

(1)伺服器端

 1 import java.io.BufferedReader;
 2 import
java.io.IOException; 3 import java.io.InputStreamReader; 4 import java.io.PrintWriter; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 8 public class Server { //搭建伺服器端 9 public static void main(String[] args) throws IOException{ 10 Server server = new Server(); //建立一個伺服器端Socket 11 server.oneServer(); 12 } 13 public void oneServer(){ 14 try{ 15 ServerSocket server=null; 16 try{ 17 server=new ServerSocket(5000); //指定繫結的埠,並監聽此埠。 18 System.out.println("伺服器啟動成功"); 19 }catch(Exception e) { 20 System.out.println("沒有啟動監聽:"+e); 21 //出錯,打印出錯資訊 22 } 23 Socket socket=null; 24 try{ 25 socket=server.accept(); 26 //2、呼叫accept()方法開始監聽,等待客戶端的連線 27 //使用accept()阻塞等待客戶請求,有客戶 28 //請求到來則產生一個Socket物件,並繼續執行 29 }catch(Exception e) { 30 System.out.println("Error."+e); 31 //出錯,打印出錯資訊 32 } 33 String line; 34 BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream())); 35 PrintWriter writer=new PrintWriter(socket.getOutputStream()); 36 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 37 System.out.println("Client:"+in.readLine()); 38 //在標準輸出上列印從客戶端讀入的字串 39 line=br.readLine(); 40 //從標準輸入讀入一字串 41 while(!line.equals("end")){ //響應客戶端的請求 42 writer.println(line); 43 writer.flush(); //重新整理輸出流,使Client馬上收到該字串 44 System.out.println("服務:"+line); 45 System.out.println("客戶:"+in.readLine()); 46 //從Client讀入一字串,並列印到標準輸出上 47 line=br.readLine(); 48 } 49 writer.close(); //關閉Socket輸出流 50 in.close(); //關閉Socket輸入流 51 socket.close(); //關閉Socket 52 server.close(); //關閉ServerSocket 53 }catch(Exception e) { 54 System.out.println("Error."+e); 55 } 56 } 57 }

(2)客戶端

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.PrintWriter;
 6 import java.net.InetAddress;
 7 import java.net.Socket;
 8 import java.net.URL;
 9 
10 public class Client {   // 搭建客戶端
11     public static void main(String[] args) throws IOException {
12         try {
13             Socket socket = new Socket("192.168.43.105", 5000);
14             System.out.println("客戶端啟動成功");
15             // 向本機的5000埠發出客戶請求
16             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
17             PrintWriter write = new 
18 PrintWriter(socket.getOutputStream());
19             //獲取輸入流,並讀取伺服器端的響應資訊 
20             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
21             String readline;
22             readline = br.readLine(); // 從系統標準輸入讀入一字串
23             while (!readline.equals("end")) {
24                 write.println(readline);
25                 // 將從系統標準輸入讀入的字串輸出到Server
26                 write.flush();
27                 System.out.println("客戶:" + readline);
28                 // 在系統標準輸出上列印讀入的字串
29                 System.out.println("服務:" + in.readLine());
30                 // 從Server讀入一字串,並列印到標準輸出上
31                 readline = br.readLine(); 
32             }
33             write.close();   // 關閉Socket輸出流
34             in.close();        // 關閉Socket輸入流
35             socket.close(); // 關閉Socket
36         } catch (Exception e) {
37             System.out.println("can not listen to:" + e);
38         }
39     }
40 
41 }

2.執行截圖

伺服器端:接收Client所傳送的“少時誦詩書所所”字串,併發送“woidshaoidhwoa”字串給Client,驗證雙向導通

客戶端:向伺服器端傳送“少時誦詩書所所”字串,並接收“woidshaoidhwoa”字串

四、下一步開發計劃

通過socket程式設計傳輸遊戲資料,完成遊戲的互動行為。