軟體工程-黃金點遊戲 21組 第12,13周
阿新 • • 發佈:2020-11-30
一、開發思路
根據黃金點遊戲多使用者參與的特徵,思考將遊戲與多執行緒連線結合起來,上週所做工作實現了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) throwsIOException { 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多使用者的連線傳輸,之後完成黃金點遊戲的設計。