Java网络编程精解之ServerSocket用法详解二(1)

发表于:2007-06-11来源:作者:点击数: 标签:
第3章 ServerSocket用法详解 第10章 Java 语言的反射机制 第13章 基于MVC和R MI 的分布 ServerSocket用法详解一 Java语言的反射机制一 基于MVC和RMI的分布式应用一 ServerSocket用法详解二 Java语言的反射机制二 基于MVC和RMI的分布式应用二 ServerSocket用

第3章 ServerSocket用法详解 第10章 Java语言的反射机制 第13章 基于MVC和RMI的分布
ServerSocket用法详解一
Java语言的反射机制一
基于MVC和RMI的分布式应用一
ServerSocket用法详解二
Java语言的反射机制二
基于MVC和RMI的分布式应用二
ServerSocket用法详解三
   

相关文章链接:

Java网络编程精解之ServerSocket用法详解一

Java网络编程精解之ServerSocket用法详解三

3.6  创建多线程的服务器

在本书第1章的1.5.1节的例程1-2的EchoServer中,其service()方法负责接收客户连接,以及与客户通信。service()方法的处理流程如下:

while (true) {

Socket socket=null;

try {

socket = serverSocket.aclearcase/" target="_blank" >ccept();     //接收客户连接

//从Socket中获得输入流与输出流,与客户通信





}catch (IOException e) {

e.printStackTrace();

}finally {

try{

if(socket!=null)socket.close();    //断开连接

}catch (IOException e) {e.printStackTrace();}

}

}

EchoServer接收到一个客户连接,就与客户进行通信,通信完毕后断开连接,然后再接收下一个客户连接。假如同时有多个客户请求连接,这些客户就必须排队等候EchoServer的响应。EchoServer无法同时与多个客户通信。

许多实际应用要求服务器具有同时为多个客户提供服务的能力。HTTP服务器就是最明显的例子。任何时刻,HTTP服务器都可能接收到大量的客户请求,每个客户都希望能快速得到HTTP服务器的响应。如果长时间让客户等待,会使网站失去信誉,从而降低访问量。

可以用并发性能来衡量一个服务器同时响应多个客户的能力。一个具有好的并发性能的服务器,必须符合两个条件:

◆能同时接收并处理多个客户连接;

◆对于每个客户,都会迅速给予响应。

服务器同时处理的客户连接数目越多,并且对每个客户作出响应的速度越快,就表明并发性能越高。

用多个线程来同时为多个客户提供服务,这是提高服务器的并发性能的最常用的手段。本节将按照3种方式来重新实现EchoServer,它们都使用了多线程。

◆为每个客户分配一个工作线程。

◆创建一个线程池,由其中的工作线程来为客户服务。

◆利用JDK的Java类库中现成的线程池,由它的工作线程来为客户服务。

3.6.1  为每个客户分配一个线程

服务器的主线程负责接收客户的连接,每次接收到一个客户连接,就会创建一个工作线程,由它负责与客户的通信。以下是EchoServer的service()方法的代码:

public void service() {

while (true) {

Socket socket=null;

try {

socket = serverSocket.accept();      //接收客户连接

Thread workThread=new Thread(new Handler(socket));   //创建一个工作线程

workThread.start();        //启动工作线程

}catch (IOException e) {

e.printStackTrace();

}

}

}

以上工作线程workThread执行Handler的run()方法。Handler类实现了Runnable接口,它的run()方法负责与单个客户通信,与客户通信结束后,就会断开连接,执行Handler的run()方法的工作线程也会自然终止。如例程3-5所示是EchoServer类及Handler类的源程序。

例程3-5  EchoServer.java(为每个任务分配一个线程)

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("服务器启动");

}

public void service() {

while (true) {

Socket socket=null;

try {

socket = serverSocket.accept();      //接收客户连接

Thread workThread=new Thread(new Handler(socket));   //创建一个工作线程

workThread.start();        //启动工作线程

}catch (IOException e) {

e.printStackTrace();

}

}

}

public static void main(String args[])throws IOException {

new EchoServer().service();

}

}

class Handler implements Runnable{       //负责与单个客户的通信

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) {     //接收和发送数据,直到通信结束

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();}

}

}

}


共5页: 1 [2] [3] [4] [5] 下一页

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
...