首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 編程那些事兒 109:網絡編程示例二——猜數字遊戲(TCP 實現)

     編輯:Java 相關知識

13.3.2 猜數字控制台小遊戲

規則:客戶端首次連接,服務端生成 0-50 隨機數。客戶端輸入數字猜測,每次發送至服務端,服務端比較並回饋結果(大了/小了/相等)。共 5 次機會,猜中提示慶祝,輸入 "quit" 結束。

功能劃分原則

  • 客戶端:接收用戶輸入、基礎校驗、按協議發送數據、根據回饋提示。
  • 服務端:接收數據、解析協議、核心邏輯判斷、生成回饋數據、發送回饋。

協議設計

客戶端發送:用戶輸入數字轉字符串再轉 byte 陣列;發送 "quit" 代表退出。
服務端回饋:1 字節,0=相等(猜中)、1=大了、2=小了、其他=錯誤。

客戶端完整代碼

package guess;
import java.net.*;
import java.io.*;

public class TCPClient {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
InputStream is = null;
BufferedReader br = null;
byte[] data = new byte[2];
try {
socket = new Socket("127.0.0.1", 10001);
os = socket.getOutputStream();
is = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(System.in));

while (true) {
System.out.println("請輸入數字:");
String s = br.readLine();
if (s.equals("quit")) {
os.write("quit".getBytes());
break;
}
boolean b = true;
try { Integer.parseInt(s); } catch (Exception e) { b = false; }
if (b) {
os.write(s.getBytes());
is.read(data);
switch (data[0]) {
case 0: System.out.println("相等!祝賀你!"); break;
case 1: System.out.println("大了!"); break;
case 2: System.out.println("小了!"); break;
default: System.out.println("其它錯誤!");
}
System.out.println("你已經猜了 " + data[1] + " 次!");
if (data[1] >= 5) {
System.out.println("你掛了!");
os.write("quit".getBytes());
break;
}
} else {
System.out.println("輸入錯誤!");
}
}
} catch (Exception e) { e.printStackTrace(); }
finally {
try { br.close(); is.close(); os.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); }
}
}
}

流程:建立連接 → 初始化流 → 循環接收輸入 → 校驗 → 發送 → 接收回饋 → 解析顯示 → 判斷次數 → 關閉資源。

服務端實現(控制類 + 邏輯線程)

package guess;
import java.net.*;

public class TCPServer {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(10001);
System.out.println("服務器已啟動:");
while (true) {
Socket s = ss.accept();
new LogicThread(s);
}
} catch (Exception e) { e.printStackTrace(); }
}
}

package guess;
import java.net.*;
import java.io.*;
import java.util.*;

public class LogicThread extends Thread {
Socket s;
static Random r = new Random();

public LogicThread(Socket s) { this.s = s; start(); }

public void run() {
int randomNumber = Math.abs(r.nextInt() % 51);
int guessNumber = 0;
InputStream is = null;
OutputStream os = null;
byte[] data = new byte[2];
try {
is = s.getInputStream();
os = s.getOutputStream();
while (true) {
byte[] b = new byte[1024];
int n = is.read(b);
String send = new String(b, 0, n);
if (send.equals("quit")) break;
try {
int num = Integer.parseInt(send);
guessNumber++;
data[1] = (byte) guessNumber;
if (num > randomNumber) data[0] = 1;
else if (num < randomNumber) data[0] = 2;
else {
data[0] = 0;
guessNumber = 0;
randomNumber = Math.abs(r.nextInt() % 51);
}
os.write(data);
} catch (Exception e) {
data[0] = 3;
data[1] = (byte) guessNumber;
os.write(data);
break;
}
os.flush();
}
} catch (Exception e) { e.printStackTrace(); }
finally {
try { is.close(); os.close(); s.close(); } catch (Exception e) {}
}
}
}

服務端控制類監聽端口,接受連接啟動邏輯線程。邏輯線程生成隨機數,循環處理客戶端請求,判斷大小回饋,記錄猜測次數,猜中後重置次數並生成新隨機數讓遊戲持續。

結構與上一示例類似,對比學習可深化網絡編程認知。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved