Java進階學習:網(wǎng)絡服務器編程

字號:

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