随笔 - 303  文章 - 883  trackbacks - 0
<2007年2月>
28293031123
45678910
11121314151617
18192021222324
25262728123
45678910

欢迎光临! 
闲聊 QQ:1074961813

随笔分类(357)

我管理的群

公共blog

  • n维空间
  • Email : java3d@126.com 群 : 12999758

参与管理的论坛

好友的blog

我的其他blog

朋友的网站

搜索

  •  

最新评论

ServerSocket用法详解 教程下载   源代码下载

嗨,大家好,我是寻觅:各位JAVA爱好者你现在看到是本人摘取上面教程的一部分,即我和一个网友遇到的问题,和解决。如果你对ServerSocket用法很重视,想系统学习;请下载上面的教程(来自:developer.51cto.com),谢谢支持 !

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

}

}

}




 



地震让大伙知道:居安思危,才是生存之道。
posted on 2007-02-22 23:05 小寻 阅读(1260) 评论(0)  编辑  收藏 所属分类: j2se/j2ee/j2menetwork

只有注册用户登录后才能发表评论。


网站导航: