ServerSocket用法詳解
教程下載??
源代碼下載
嗨,大家好,我是尋覓:各位JAVA愛好者你現(xiàn)在看到是本人摘取上面教程的一部分,即我和一個網(wǎng)友遇到的問題,和解決。如果你對ServerSocket用法很重視,想系統(tǒng)學(xué)習(xí);請下載上面的教程(來自:developer.51cto.com),謝謝支持 !3.6? 創(chuàng)建多線程的服務(wù)器
在本書第1章的1.5.1節(jié)的例程1-2的EchoServer中,其service()方法負(fù)責(zé)接收客戶連接,以及與客戶通信。service()方法的處理流程如下:
while (true) {
Socket socket=null;
try {
socket = serverSocket.accept();? ???//接收客戶連接
//從Socket中獲得輸入流與輸出流,與客戶通信
…
}catch (IOException e) {
e.printStackTrace();
}finally {
try{
if(socket!=null)socket.close();? ??//斷開連接
}catch (IOException e) {e.printStackTrace();}
}
}
|
EchoServer接收到一個客戶連接,就與客戶進(jìn)行通信,通信完畢后斷開連接,然后再接收下一個客戶連接。假如同時有多個客戶請求連接,這些客戶就必須排隊等候EchoServer的響應(yīng)。EchoServer無法同時與多個客戶通信。
許多實際應(yīng)用要求服務(wù)器具有同時為多個客戶提供服務(wù)的能力。HTTP服務(wù)器就是最明顯的例子。任何時刻,HTTP服務(wù)器都可能接收到大量的客戶請求,每個客戶都希望能快速得到HTTP服務(wù)器的響應(yīng)。如果長時間讓客戶等待,會使網(wǎng)站失去信譽(yù),從而降低訪問量。
可以用并發(fā)性能來衡量一個服務(wù)器同時響應(yīng)多個客戶的能力。一個具有好的并發(fā)性能的服務(wù)器,必須符合兩個條件:
◆能同時接收并處理多個客戶連接;
◆對于每個客戶,都會迅速給予響應(yīng)。
服務(wù)器同時處理的客戶連接數(shù)目越多,并且對每個客戶作出響應(yīng)的速度越快,就表明并發(fā)性能越高。
用多個線程來同時為多個客戶提供服務(wù),這是提高服務(wù)器的并發(fā)性能的最常用的手段。本節(jié)將按照3種方式來重新實現(xiàn)EchoServer,它們都使用了多線程。
◆為每個客戶分配一個工作線程。
◆創(chuàng)建一個線程池,由其中的工作線程來為客戶服務(wù)。
◆利用JDK的Java類庫中現(xiàn)成的線程池,由它的工作線程來為客戶服務(wù)。
3.6.1? 為每個客戶分配一個線程
服務(wù)器的主線程負(fù)責(zé)接收客戶的連接,每次接收到一個客戶連接,就會創(chuàng)建一個工作線程,由它負(fù)責(zé)與客戶的通信。以下是EchoServer的service()方法的代碼:
public void service() {
while (true) {
Socket socket=null;
try {
socket = serverSocket.accept();? ????//接收客戶連接
Thread workThread=new Thread(new Handler(socket));? ?//創(chuàng)建一個工作線程
workThread.start();? ??????//啟動工作線程
}catch (IOException e) {
e.printStackTrace();
}
}
}
|
以上工作線程workThread執(zhí)行Handler的run()方法。Handler類實現(xiàn)了Runnable接口,它的run()方法負(fù)責(zé)與單個客戶通信,與客戶通信結(jié)束后,就會斷開連接,執(zhí)行Handler的run()方法的工作線程也會自然終止。如例程3-5所示是EchoServer類及Handler類的源程序。
例程3-5? EchoServer.java(為每個任務(wù)分配一個線程)
package multithread1;
import java.io.*;
import java.net.*;
public class EchoServer {
private int port=8000;
private ServerSocket serverSocket; public EchoServer() throws IOException {
serverSocket = new ServerSocket(port);
System.out.println("服務(wù)器啟動");
} public void service() {
while (true) {
Socket socket=null;
try {
socket = serverSocket.accept();? ????//接收客戶連接
Thread workThread=new Thread(new Handler(socket));? ?//創(chuàng)建一個工作線程
workThread.start();? ??????//啟動工作線程
}catch (IOException e) {
e.printStackTrace();
}
}
} public static void main(String args[])throws IOException {
new EchoServer().service();
}
} class Handler implements Runnable{? ?????//負(fù)責(zé)與單個客戶的通信
private Socket socket;
public Handler(Socket socket){
this.socket=socket;
}
private PrintWriter getWriter(Socket socket)throws IOException{…}
private BufferedReader getReader(Socket socket)throws IOException{…}
public String echo(String msg) {…}
public void run(){
try {
System.out.println("New connection accepted " +
socket.getInetAddress() + ":" +socket.getPort());
BufferedReader br =getReader(socket);
PrintWriter pw = getWriter(socket);
String msg = null;
while ((msg = br.readLine()) != null) {? ???//接收和發(fā)送數(shù)據(jù),直到通信結(jié)束
System.out.println(msg);
pw.println(echo(msg));
if (msg.equals("bye"))
break;
}
}catch (IOException e) {
e.printStackTrace();
}finally {
try{
if(socket!=null)socket.close();?? ????//斷開連接
}catch (IOException e) {e.printStackTrace();}
}
}
}
|
?
地震讓大伙知道:居安思危,才是生存之道。
posted on 2007-02-22 23:05
小尋 閱讀(1274)
評論(0) 編輯 收藏 所屬分類:
j2se/j2ee/j2me 、
network