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

軟體工程-黃金點遊戲 21組 第12,13周

一、開發思路

根據黃金點遊戲多使用者參與的特徵,思考將遊戲與多執行緒連線結合起來,上週所做工作實現了socket連線兩個使用者,因此,在此次工作中,我們開始嘗試實現,通過socket實現多使用者的通訊,在通訊實現之後,將會嘗試將通過介面獲取到的資訊,完成多使用者之間的傳遞。

二、程式碼實現

1.程式碼介紹

在此次工作中,我們進行了通過socket實現多使用者通訊的嘗試,如何將通過介面獲取的資訊完成傳遞,我們仍然在開發中,尚未完成,因此,此處程式碼為實現多使用者連線通訊的功能程式碼。

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 12 public static void main(String[] args) throws
IOException { 13 Client client = new Client(); 14 client.oneClient(); 15 } 16 17 // 搭建客戶端 18 public void oneClient(){ 19 try { 20 // 1、建立客戶端Socket,指定伺服器地址和埠 21 Socket socket = new Socket("10.132.22.157", 5000); 22 System.out.println("客戶端啟動成功");
23 // 2、獲取輸出流,向伺服器端傳送資訊 24 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 25 PrintWriter write = new PrintWriter(socket.getOutputStream()); 26 //3、獲取輸入流,並讀取伺服器端的響應資訊 27 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 28 String readline; 29 readline = br.readLine(); // 從系統標準輸入讀入一字串 30 while (!readline.equals("end")) { 31 // 若從標準輸入讀入的字串為 "end"則停止迴圈 32 write.println(readline); 33 // 將從系統標準輸入讀入的字串輸出到Server 34 write.flush(); 35 // 重新整理輸出流,使Server馬上收到該字串 36 System.out.println(in.readLine()); 37 // 從Server讀入一字串,並列印到標準輸出上 38 readline = br.readLine(); // 從系統標準輸入讀入一字串 39 } // 繼續迴圈 40 //4、關閉資源 41 write.close(); // 關閉Socket輸出流 42 in.close(); // 關閉Socket輸入流 43 socket.close(); // 關閉Socket 44 } catch (Exception e) { 45 System.out.println("can not listen to:" + e); 46 } 47 } 48 49 }

伺服器端:

 1 package GoldenPoint;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStreamReader;
 6 import java.io.PrintWriter;
 7 import java.net.ServerSocket;
 8 import java.net.Socket;
 9 import java.util.ArrayList;
10 
11 public class Server extends Thread{
12     private static ArrayList clients = new ArrayList();                                //客戶端集合
13     
14     // 搭建伺服器端
15     public static void main(String[] args) throws IOException {
16         Server server = new Server();
17         server.oneServer();
18     }
19 
20     public void oneServer(){
21         try {
22             ServerSocket server = new ServerSocket(5000);
23             System.out.println("伺服器已啟動");
24             int orderOfclients = 0;
25             while(true) {
26                 Socket client = server.accept();                    //與客戶端連線
27                 orderOfclients ++;
28                 System.out.println(orderOfclients+"號使用者已連線");
29                 clients.add(client);                                //加入客戶端集合
30                 new Thread(new ServerThread(client,clients)).start();
31             }
32         } catch(IOException e) {
33             e.printStackTrace();
34         }
35     }
36 }
37 
38 
39 class ServerThread extends Thread{
40     private Socket client;            
41     private ArrayList clients;
42     
43     
44     public ServerThread(Socket client,ArrayList clients) {                    //用含參的構造方法進行賦值
45         this.client=client;
46         this.clients=clients;
47     }
48     
49     @Override
50     public void run() {
51         try {
52             
53             //客戶端與服務端相互發送訊息
54             BufferedReader InputFromClient = new BufferedReader(new InputStreamReader(client.getInputStream()));            //為客戶端的輸入流建立BufferedReader物件
55             BufferedReader InputFromServer = new BufferedReader(new InputStreamReader(System.in));                //為伺服器端的輸入流建立BufferedReader物件
56             PrintWriter OutputToClients = new PrintWriter(client.getOutputStream());            //為其他客戶端的輸出流建立PrintWriter物件
57             String MsgFromClient = InputFromClient.readLine();
58             int number = clients.indexOf(client) + 1;                                        //獲取該客戶的序號
59             System.out.println(number + "號使用者:" + MsgFromClient);
60             
61             String MsgFromServer = InputFromServer.readLine();
62             
63             while(!MsgFromServer.equals("end")) {
64                 OutputToClients.println("伺服器:" + MsgFromServer);
65                 OutputToClients.flush();
66                 MsgFromClient = InputFromClient.readLine();
67                 System.out.println(number + "號使用者:" + MsgFromClient);
68                 MsgFromServer = InputFromServer.readLine();
69             }
70             
71             InputFromClient.close();
72             InputFromServer.close();
73             OutputToClients.close();
74             client.close();
75         } catch(IOException e) {
76             e.printStackTrace();
77         }
78     }
79 }

三、執行截圖

四、下一步工作計劃

程式碼實現將通過介面獲取到的使用者資訊通過socket多使用者的連線傳輸,之後完成黃金點遊戲的設計。