您所在的位置:IT专家堂 > 开发 > Java网络编程精解之ServerSocket用法详解二(1)

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

2007-02-11 15:06 孙卫琴 51CTO.com 字号:T | T
一键收藏,随时查看,分享好友!

孙卫琴老师新作《Java网络编程精解》中的第三章“ServerSocket用法详解”,小编给它切分为一个小系列,共三篇文章。本文是其中的第二篇,具体内容包括创建多线程的服务器,供大家参考!

AD:

第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.accept();     //接收客户连接
//从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();}
}
}
}

内容导航



分享到:

栏目热门

更多>>

  • 头条 使用检查约束验证SQL Server中的数据
  • 构建应用程序最关键的目标之一是确保所有进入数据库的数据都要符合你的业务规则,数据校验是应用程序的关键部分,确保你的数据满足业务分析师制定的需求。本文将给大家介绍如何使用检查约束验证SQL Server中的数据。
  1. 对话职业经理人阿朱:程序员转型期的职业选择
  2. 从检测到防护:全面打造网站安全

热点职位

更多>>

热点专题

更多>>

读书

精通Spring 2.x——企业应用开发详解
本书深刻揭示了Spring的技术内幕,对IoC、AOP、事务管理等根基性的技术进行了深度的挖掘。读者阅读本书后,不但可以熟练使用Spri

51CTO旗下网站

领先的IT技术网站 51CTO 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 51CTO学院