?? serverconnection.java
字號(hào):
import java.io.*;
import java.net.*;
import java.util.*;
/**
* 該類封裝了與服務(wù)器和對(duì)手之間的通訊
**/
class ServerConnection implements Runnable {
private static final int port = 6564; // 端口號(hào)
private static final String CRLF = "\r\n";
private BufferedReader in; // 與服務(wù)器間的I/O流
private PrintWriter out;
private String id, toid = null; // 本地ID和對(duì)手ID
private Scrabblet scrabblet;
/** 構(gòu)造函數(shù)利用一個(gè)網(wǎng)絡(luò)站點(diǎn)名,打開(kāi)一個(gè)套接字連接到對(duì)應(yīng)主機(jī)上的端口
* 如果成功,用InputStreamReader和BufferedReader包裝輸入,用PrintWriter
* 包裝輸出。如果失敗,向調(diào)用者引發(fā)一個(gè)異常
**/
public ServerConnection(Scrabblet sc, String site) throws IOException {
scrabblet = sc;
Socket server = new Socket(site, port);
in = new BufferedReader(new InputStreamReader(server.getInputStream()));
out = new PrintWriter(server.getOutputStream(), true);
}
private String readline() {
try {
return in.readLine();
} catch (IOException e) {
return null;
}
}
/** 該方法通知服務(wù)器本地游戲者的名字 */
void setName(String s) {
out.println("name " + s);
}
/** 該方法將自己從服務(wù)器的列表上刪除 */
void delete() {
out.println("delete " + id);
}
/** 綁定對(duì)手的id */
void setTo(String to) {
toid = to;
}
void send(String s) {
if (toid != null)
out.println("to " + toid + " " + s);
}
// 下面的方法都是從客戶端向服務(wù)器發(fā)送一行消息,然后服務(wù)器將這些消息
// 發(fā)送給對(duì)手。
/** challenge消息初始啟動(dòng)游戲 */
void challenge(String destid) {
setTo(destid);
send("challenge " + id);
}
/** accept消息用來(lái)響應(yīng)挑戰(zhàn) */
void accept(String destid, int seed) {
setTo(destid);
send("accept " + id + " " + seed);
}
void chat(String s) {
send("chat " + id + " " + s);
}
/** 每次移動(dòng)一個(gè)字母,發(fā)送一個(gè)move消息 */
void move(String letter, int x, int y) {
send("move " + letter + " " + x + " " + y);
}
/** 每次回合結(jié)束時(shí)發(fā)送turn消息 */
void turn(String words, int score) {
send("turn " + score + " " + words);
}
/** 客戶退出或離開(kāi)程序時(shí)發(fā)送quit消息 */
void quit() {
send("quit " + id); // tell other player
out.println("quit"); // unhook
}
// 啟動(dòng)線程管理客戶方面的網(wǎng)絡(luò)
private Thread t;
void start() {
t = new Thread(this);
t.start();
}
// 這里顯示的靜態(tài)變量和靜態(tài)塊被用來(lái)初始化keys Hashtable, 這里使用這個(gè)
// 散列表在keystrings中的字符串和數(shù)組位置之間映射
private static final int ID = 1;
private static final int ADD = 2;
private static final int DELETE = 3;
private static final int MOVE = 4;
private static final int CHAT = 5;
private static final int QUIT = 6;
private static final int TURN = 7;
private static final int ACCEPT = 8;
private static final int CHALLENGE = 9;
private static Hashtable keys = new Hashtable();
private static String keystrings[] = {
"", "id", "add", "delete", "move", "chat",
"quit", "turn", "accept", "challenge"
};
static {
for (int i = 0; i < keystrings.length; i++)
keys.put(keystrings[i], new Integer(i));
}
private int lookup(String s) {
Integer i = (Integer) keys.get(s);
return i == null ? -1 : i.intValue();
}
/** 該函數(shù)是游戲連接服務(wù)器的主循環(huán)。它進(jìn)入一個(gè)阻塞調(diào)用的readline(),
* 這個(gè)調(diào)用在服務(wù)器返回一行文字時(shí)返回一個(gè)字符串。它使用StringTokenizer
* 將一行文字拆成單詞。switch語(yǔ)句基于輸入行的第一個(gè)單詞分配合適的代碼。
**/
public void run() {
String s;
StringTokenizer st;
while ((s = readline()) != null) {
st = new StringTokenizer(s);
String keyword = st.nextToken();
switch (lookup(keyword)) {
default:
System.out.println("bogus keyword: " + keyword + "\r");
break;
case ID:
id = st.nextToken();
break;
case ADD: {
String id = st.nextToken();
String hostname = st.nextToken();
String name = st.nextToken(CRLF);
scrabblet.add(id, hostname, name);
}
break;
case DELETE:
scrabblet.delete(st.nextToken());
break;
case MOVE: {
String ch = st.nextToken();
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
scrabblet.move(ch, x, y);
}
break;
case CHAT: {
String from = st.nextToken();
scrabblet.chat(from, st.nextToken(CRLF));
}
break;
case QUIT: {
String from = st.nextToken();
scrabblet.quit(from);
}
break;
case TURN: {
int score = Integer.parseInt(st.nextToken());
scrabblet.turn(score, st.nextToken(CRLF));
}
break;
case ACCEPT: {
String from = st.nextToken();
int seed = Integer.parseInt(st.nextToken());
scrabblet.accept(from, seed);
}
break;
case CHALLENGE: {
String from = st.nextToken();
scrabblet.challenge(from);
}
break;
}
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -