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();}
}
}
}
|
分享到:
相关推荐
本文系统讲解了java网络编程,serverSocket的使用方法及实例
本章首先介绍 ServerSocket 类的各个构造方法,以及成员方法的用法,接着介绍服务器如何用多线程来处理与多个客户的通信任务。 本章提供线程池的一种实现方式。线程池包括一个工作队列和若干工作线程。服务器程序向...
ServerSocket 用法详解
Java网络编程的基础知识、套接字编程、非阻塞通信、创建HTTP服务器与客户程序、数据报通信、对象的序列化与反序列化、Java反射机制、RMI框架、JDBC API、JavaMail API、MVC设计模式、安全网络通信、CORBA和Web服务
ServerSocket用法详解 提供线程池的一种实现方式。线程池包括一个工作队列和若干工作线程。服务器程 序向工作队列中加入与客户通信的任务,工作线程不断从工作队列中取出任务并执行它。介绍了java.util.concurrent...
Socket与ServerSocket编程实践聊天,服务器和客户端频繁通信
!ServerSocket详解 !ServerSocket详解
Android完全支持JDK本身的TCP,UDP网络通信API,也可以使用ServerSocket,Socket来建立基于TCP/IP协议的网络通信,也可以使用DatagramSocket,Datagrampacket来建 立基于UDP协议的网络通信
Java实现基于TCP的Socket&ServerSocket通讯
ServerSocket类.pdf
java网络编程精简第三章(ServerSocket)
serversocket web服务器
11.1.3 使用UDP协议的Socket 网络编程 289 11.1.4 多点传送和MulticastSocket类 290 11.1.5 NIO及相关技术 290 11.2 练习 291 11.2.1 ServerSocket与Socket示例: 开发一个Server-Client模型的程序 291 11.2.2 ...
Java网络编程基础 Datagram类使用方法 (1) .doc Java网络编程基础 InetAddress类的使用.doc Java网络编程基础 ServerSocket类使用.doc 《JAVA编程规范》.doc Java基础 三步学会Java Socket编程(一) .doc Java基础 ...
有关java线程循环和serversocket和socket的程序借鉴.pdf
socket和serversocket利用IO流编写的多线程连接相互发送消息
Socket+ServerSocket代码
Java网络编程精讲,主要涉及Socket,ServerSocket,NIO,http协议,tcp,udp精讲等等