Java的Socket API提供了一個(gè)很方便的對(duì)象接口進(jìn)行網(wǎng)絡(luò)編程。本文用一個(gè)簡(jiǎn)單的TCP Echo Server做例子,演示了如何使用Java完成一個(gè)網(wǎng)絡(luò)服務(wù)器。
用作例子的TCP Echo Server是按以下方式工作的:
當(dāng)一個(gè)客戶端通過TCP連接到服務(wù)器后,客戶端可以通過這個(gè)連接發(fā)送數(shù)據(jù)到服務(wù)端,而服務(wù)端接收到數(shù)據(jù)后會(huì)把這些數(shù)據(jù)用同一個(gè)TCP連接發(fā)送回客戶端。服務(wù)端會(huì)一直保持這個(gè)連接直到客戶端關(guān)閉它為止。
因?yàn)榉?wù)器需要能同時(shí)處理多個(gè)客戶端,我們先選用一個(gè)常見的多線程服務(wù)模型:
讓一個(gè)Thread負(fù)責(zé)監(jiān)聽服務(wù)端口,當(dāng)有新的連接建立的時(shí)候,這個(gè)監(jiān)聽的Thread會(huì)為這個(gè)連接創(chuàng)建一個(gè)新的Thread來處理它。這樣,服務(wù)器可以接受多個(gè)連接,并讓多個(gè)Thread來分別處理它們。
以下是相應(yīng)的服務(wù)端程序:
public class EchoServer implements Runnable {
public void run() {
try {
ServerSocket svr = new ServerSocket(7);
while (true) {
Socket sock = svr.accept();
new Thread(new EchoSession(sock)).start();
}
} catch (IOException ex) {
throw new ExceptionAdapter(ex);
}
}
}
這段代碼先創(chuàng)建了一個(gè)ServerSocket的對(duì)象并讓其監(jiān)聽在TCP端口7上,然后在一個(gè)循環(huán)中用accept()方法接收新的連接,并創(chuàng)建處理這一連接的Thread。實(shí)際處理每個(gè)客戶端連接的邏輯包含在EchoSession這個(gè)類里面。
在以上代碼中使用了ExceptionAdapter這個(gè)類,它的作用是把一個(gè)checked Exception包裝成RuntimeException。詳細(xì)的說明可以參考避免在Java中使用Checked Exception 一文。
以下是EchoSession的代碼:
public class EchoSession implements Runnable {
public EchoSession(Socket s) {
_sock = s;
}
public void run() {
用作例子的TCP Echo Server是按以下方式工作的:
當(dāng)一個(gè)客戶端通過TCP連接到服務(wù)器后,客戶端可以通過這個(gè)連接發(fā)送數(shù)據(jù)到服務(wù)端,而服務(wù)端接收到數(shù)據(jù)后會(huì)把這些數(shù)據(jù)用同一個(gè)TCP連接發(fā)送回客戶端。服務(wù)端會(huì)一直保持這個(gè)連接直到客戶端關(guān)閉它為止。
因?yàn)榉?wù)器需要能同時(shí)處理多個(gè)客戶端,我們先選用一個(gè)常見的多線程服務(wù)模型:
讓一個(gè)Thread負(fù)責(zé)監(jiān)聽服務(wù)端口,當(dāng)有新的連接建立的時(shí)候,這個(gè)監(jiān)聽的Thread會(huì)為這個(gè)連接創(chuàng)建一個(gè)新的Thread來處理它。這樣,服務(wù)器可以接受多個(gè)連接,并讓多個(gè)Thread來分別處理它們。
以下是相應(yīng)的服務(wù)端程序:
public class EchoServer implements Runnable {
public void run() {
try {
ServerSocket svr = new ServerSocket(7);
while (true) {
Socket sock = svr.accept();
new Thread(new EchoSession(sock)).start();
}
} catch (IOException ex) {
throw new ExceptionAdapter(ex);
}
}
}
這段代碼先創(chuàng)建了一個(gè)ServerSocket的對(duì)象并讓其監(jiān)聽在TCP端口7上,然后在一個(gè)循環(huán)中用accept()方法接收新的連接,并創(chuàng)建處理這一連接的Thread。實(shí)際處理每個(gè)客戶端連接的邏輯包含在EchoSession這個(gè)類里面。
在以上代碼中使用了ExceptionAdapter這個(gè)類,它的作用是把一個(gè)checked Exception包裝成RuntimeException。詳細(xì)的說明可以參考避免在Java中使用Checked Exception 一文。
以下是EchoSession的代碼:
public class EchoSession implements Runnable {
public EchoSession(Socket s) {
_sock = s;
}
public void run() {

