




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、12本次课程主要内容一 基础知识及TCP应用二 UDP相关应用3基础知识及TCP应用包含以下主要内容一 网络基础概念二 神密的套接字三 Java中网络编程主要API介绍四 Socket与ServerSocket介绍五 高级应用4网络基础概念一 计算机组网二 Tcp/Ip网络层次介绍三 网络端口号介绍四 套接字简介(socket)51.1.1 计算机组网简介计算机以一种非常简单的方式进行相互间的操作和通信。计算机芯片是以 1 和 0 的形式存储并传输数据的开闭转换器的集合。当计算机想共享数据时,它们所需做的全部就是以一致的速度、顺序、定时等等来回传输几百万比特和字节的数据流。每次想在两个应用程序
2、之间进行信息通信时,您怎么会愿意担心那些细节呢?为免除这些担心,我们需要每次都以相同方式完成该项工作的一组包协议。这将允许我们处理应用程序级的工作,而不必担心低级网络细节。这些成包协议称为协议栈(stack)。TCP/IP 是当今最常见的协议栈。多数协议栈(包括 TCP/IP)都大致对应于国际标准化组织(International Standards Organization,ISO)的开放系统互连参考模型(Open Systems Interconnect Reference Model,OSIRM)。OSIRM 认为在一个可靠的计算机组网中有七个逻辑层(见图)。各个地方的公司都对这个模型某
3、些层的实现做了一些贡献,从生成电子信号(光脉冲、射频等等)到提供数据给应用程序。TCP/IP 映射到 OSI 模型中的两层的情形如图所示。我们不想涉及层的太多细节,但您应该知道套接字位于什么地方。61.1.1计算机组网简介n 套接字位于什么地方套接字位于什么地方套接字大致驻留在 OSI 模型的会话层(见图)。会话层夹在其上面向应用的层和其下的实时数据通信层之间。会话层为两台计算机之间的数据流提供管理和控制服务。作为该层的一部分,套接字提供一个隐藏从导线上获取比特和字节的复杂性的抽象。换句话说,套接字允许我们让应用程序表明它想发送一些字节即可传输数据。套接字隐藏了完成该项工作的具体细节。当您打电
4、话时,您的声音传到传感器,传感器把它转换成可以传输的电数据。电话机是人与电信网络的接口。您无须知道声音如何传输的细节,只要知道想打电话给谁就行了。同样地,套接字扮演隐藏在未知通道上传输 1 和 0 的复杂性的高级接口的角色。 71.1.1计算机组网简介使用套接字的代码工作于表示层。表示层提供应用层能够使用的信息的公共表示。假设您打算把应用程序连接到只能识别 EBCDIC 的旧的银行系统。应用程序的域对象以 ASCII 格式存储信息。在这种情况下,您得负责在表示层上编写把数据从 EBCDIC 转换成 ASCII 的代码,然后(比方说)给应用层提供域对象。应用层然后就可以用域对象来做它想做的任何事
5、情。您编写的套接字处理代码只存在于表示层中。您的应用层无须知道套接字如何工作的任何事情81.1.2 Tcp/Ip网络层次介绍n 应用层大多数基于Internet的应用程序被看作TCP/IP网络的最上层应用层应用层, 如:ftp,http,smtp,pop3,telnet,nntp等。n 网络层网络层对TCP/IP网络中的硬件资源进行标识。连接到TCP/IP网络中的每台计算机(或其他设备)都有唯一的地址,这就是IPIP地址地址。IP地址实质上是一个32位的整数,通常以“%d.%d.%d.%d%d.%d.%d.%d”的形式表示,每个d是一个8位整数。n 传输层在TCP/IP网络中,不同的机器之间进
6、行通信时,数据的传输是由传输层传输层控制的,这包括数据要发往的目标机器及应用程序、数据的质量控制等。 TCP/IP网络中最常用的传输协议就是TCPTCP(Transport Control Protocol)和UDPUDP(User Datagram Protocol)。91.1.3 网络端口号介绍-为什么会产生端口?n 为什么会产生端口?一台机器通常只通过一条链路连接到网络上,即它只有一个IP地址,但一台机器中往往有很多应用程序需要进行网络通信,如何区分呢?这就要靠网络端口号网络端口号(port)了。端口号是用整数来表达的,其范围为065535,其中01023为系统所保留,专门给那些通用的服
7、务(well-known services),如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口为23,因此,当我们编写通信程序时,应选择一个大于1023的数作为端口号,以免发生冲突。IP与端口号组合而得出的Socket,可以完全分辨Internet上运行的程序。网络服务网络服务httpftp其他服务23telnet端端口口2180客户程序客户程序SocketIP,port101.1.3 网络端口号介绍-什么是端口?n 什么是端口?一台机器通常只通过一条链路连接到网络上,即它只有一个IP地址,但一台机器中往往有很多应用程序需要进行网络通信,如何区分呢?这就要靠网络端
8、网络端口号口号(port)了。 端口号是一个标记机器的逻辑通信信道逻辑通信信道的正整数,端口号不是物理实体。IP地址和端口号组成了所谓的SocketSocket,Socket是网络上运行的程序之间双向通信链路的最后终结点,它是TCP和UDP的基础。111.1.4套接字简介(socket)n 什么是套接字?套接字是一种软件抽象,用于表达两台机器之间的连接“终端”。对于一个给定的连接,每台机器上都有一个套接字,您也可以想象它们之间有一条虚拟的“电缆”,“电缆”的每一端都插入到套接字中。当然,机器之间的物理硬件和电缆连接都是完全未知的。抽象的全部目的是使我们无须知道不必知道的细节。 简言之,一台机器
9、上的套接字与另一台机器上的套接字交谈就创建一条通信通道。程序员可以用该通道来在两台机器之间发送数据。当您发送数据时,TCP/IP 协议栈的每一层都会添加适当的报头信息来包装数据。这些报头帮助协议栈把您的数据送到目的地。好消息是 Java 语言通过流为您的代码提供数据,从而隐藏了所有这些细节,这也是为什么它们有时候被做流套接字(streaming socket)的原因。把套接字想成两端电话上的听筒 我和您通过专用通道在我们的电话听筒上讲话和聆听。直到我们决定挂断电话,对话才会结束(除非我们在使用蜂窝电话)。而且我们各自的电话线路都占线,直到我们挂断电话。121.1.4套接字简介(socket)n
10、 套接字的类型套接字的类型 一般而言,Java 语言中的套接字有以下两种形式:TCP 套接字(由 Socket 类实现,稍后我们将讨论这个类) UDP 套接字(由 DatagramSocket 类实现) TCP 和 UDP 扮演相同角色,但做法不同。两者都接收传输协议数据包并将其内容向前传送到表示层。TCP 把消息分解成数据包(数据报,datagrams)并在接收端以正确的顺序把它们重新装配起来。TCP 还处理对遗失数据包的重传请求。有了 TCP,位于上层的层要担心的事情就少多了。UDP 不提供装配和重传请求这些功能。它只是向前传送信息包。位于上层的层必须确保消息是完整的并且是以正确的顺序装配
11、的。与TCP协议不同,用户数据报协议(UDP)则是一种无连接无连接的传输协议。利用UDP协议进行数据传输时,首先需要将要传输的数据定义成数据报(Datagram),在数据报中指明数据所要达到的端点(Socket,主机地址和端口号),然后再将数据报发送出去。这种传输方式是无序的,也不能确保绝对的安全可靠,但它很简单也具有比较高的效率,这与通过邮局发送邮件邮局发送邮件的情形非常相似一般而言,UDP 强加给您的应用程序的性能开销更小,但只在应用程序不会突然交换大量数据并且不必装配大量数据报以完成一条消息的时候。否则,TCP 才是最简单或许也是最高效的选择。13java平台套接字实现一 URLConn
12、ection类简介URL连接实例演示二 Socket三 ServerSocket142.1.1 URLConnection-类简介n 什么是URL?URL是统一资源定位符(Uniform Resource Locator)的简称,它表示Internet上某一资源的地址。通过URL,就可以访问Internet。浏览器或其他程序通过解析给定的URL就可以在网络上查找相应的文件或其他资源。n URL的格式一个URL包括两部分内容:协议名称和资源名称协议名称和资源名称,中间用冒号隔开:Protocol:resourceName 如:http:/152.1.1 URLConnection-类简介n UR
13、L的操作在包中,提供了类URL来表示URL。类URL提供了很多构造方法来生成一个URL对象:public URL(Stringpublic URL(Stringspec) spec) public URL(URL context, String spec)public URL(URL context, String spec)public URL(Stringpublic URL(Stringprotocol, Stringprotocol, Stringhost, Stringhost, Stringfile) file) public URL(Stringpublic URL(String
14、protocol, Stringprotocol, Stringhost, inthost, intport, port, StringStringfile)file)以下是一些具体的构造实例:URLurl1=newURL(“http:/ URLConnection-类简介n URL的操作一个URL对象生成后,其属性是不能被改变属性是不能被改变的(与String对象相似),但可以通过它给定的方法来获取这些属性: public String getProtocolpublic String getProtocol()():获取该:获取该URLURL的协议名的协议名 public String g
15、etHostpublic String getHost() () :获取该:获取该URLURL的主机名的主机名 public String getPortpublic String getPort() () :获取该:获取该URLURL的端口号的端口号 public String getPathpublic String getPath() () :获取该:获取该URLURL的文件路径的文件路径 public String getFilepublic String getFile() () :获取该:获取该URLURL的文件名的文件名 public String getRefpublic St
16、ring getRef() () :获取该:获取该URLURL在文件中的相对位置在文件中的相对位置 public String getQuerypublic String getQuery() () :获取该:获取该URLURL的查询名的查询名172.1.1 URLConnection-类简介n通过URL读取www信息URL类提供的方法openStream(),就可以读取一个URL对象所指定的资源。public final InputStream openStreamopenStream();方法openStream()与指定的URL建立连接并返回一个InputStream对象,将URL位置的
17、资源转成一个输入数据流。通过这个InputStream对象,就可以读取资源中的数据。URLJava 程序程序InputStream182.1.2 URL连接URLConnection 类是所有在应用程序和 URL 之间创建通信链路的类的抽象超类。URLConnection 在获取 Web 服务器上的文档方面特别有用,但也可用于连接由 URL 标识的任何资源。该类的实例既可用于从资源中读,也可用于往资源中写。例如,您可以连接到一个 servlet 并发送一个格式良好的 XML String 到服务器上进行处理。URLConnection 的具体子类(例如 HttpURLConnection)提供
18、特定于它们实现的额外功能。对于我们的示例,我们不想做任何特别的事情,所以我们将使用 URLConnection 本身提供的缺省行为。 连接到连接到 URL URL 包括几个步骤:包括几个步骤:创建创建 URLConnection URLConnection 用各种用各种 setter setter 方法配置它方法配置它 连接到连接到 URLURL用各种用各种 getter getter 方法与它交互方法与它交互 192.1.3 演示事例getDocumentAtgetDocumentAt() () 方法处理方法处理获取获取 Web Web 上的文档的实际上的文档的实际工作工作 打开该打开该 U
19、RL URL 上的一个连接上的一个连接 且用且用 BufferedReader BufferedReader 读文档读文档 然后关闭然后关闭 BufferedReaderBufferedReader 202.1.4 URL连接总结实际上,URLConnection 使用套接字从我们指定的 URL 中读取信息(它只是解析成 IP 地址),但我们无须了解它,我们也不关心。但有很多事;我们马上就去看看。在继续往前讲之前,让我们回顾一下创建和使用 URLConnection 的步骤:1.用您想连接的资源的有效 URL String 实例化一个 URL(如有问题则抛出 MalformedURLExcep
20、tion)。2.打开该 URL 上的一个连接。3.把该连接的 InputStream 包装进 BufferedReader 以使您 能够读取行。4.用 BufferedReader 读文档。5.关闭 BufferedReader。21Java中网络编程主要API介绍n 面向IP层的类InetAddress (Inet4Address,Inet6Address)n 面向应用层的类面向应用层的类URLURL、URLConnectionURLConnectionn 面向网络层的类面向网络层的类 TCP协议相关类: Socket、ServerSocket UDP协议相关类: DatagramPacke
21、t、DatagramSocket、MulticastSocketn 异常异常BindException、ConnectException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownHostException、UnknownServiceException22Socket与ServerSocket介绍一 相关知识简介二 Socket相关主要方法介绍演示案例总结三 ServerSocket相关主要方法介绍演示案例总结234.1 相关知识简介在Java中,基于TCP协议实
22、现网络通信的类有两个:在客户端的Socket类和在服务器端的ServerSocket类。 在服务器端通过指定一个用来等待的连接的端口号创建一个 ServerSocket实例。 在客户端通过规定一个主机和端口号创建一个 Socket实例,连到服务器上。 ServerSocket类的accept方法使服务器处于阻塞状态,等待用户请求。244.1.1相关知识简介无论一个Socket通信程序的功能多么齐全、程序多么复杂,其基本结构都是一样的,都包括以下四个基本步骤:1、在客户方和服务器方创建Socket/ServerSocket实例。2、打开连接到Socket的输入/输出流。3、利用输入/输出流,按照
23、一定的协议对Socket进行读/写操作。4、关闭输入/输出流和Socket。注:通常,程序员的主要工作是针对所要完成的功能在第3步进行编程,第1、2、4步对所有的通信程序来说几乎都是一样的。Server端程序端程序ServerSocket(port #)Socket socket = ServerSocket.accept()接收连接接收连接OutputStreamInputStreamClose SocketClient端程序端程序Socket(host, port #)与服务器建立连接与服务器建立连接OutputStreamInputStreamClose Socketsocket254.
24、2.1 Socket主要方法简介-Socket 构造方法:publicSocket(Stringhost,intport)/远程服务器远程服务器IP及响应端口及响应端口publicSocket(InetAddressaddress,intport)publicSocket(Stringhost,intport,InetAddresslocalAddr,intlocalPort)publicSocket(InetAddressaddress,intport,InetAddresslocalAddr,intlocalPort)/在指定的机器上的指定端口上运行在指定的机器上的指定端口上运行这些方法都
25、将抛出例外IOException,程序中需要捕获处理。Socket的输入/输出流管理public InputStream getInputStreampublic InputStream getInputStream()()public void shutdownInputpublic void shutdownInput() () public OutputStream getOutputStreampublic OutputStream getOutputStream() () public void shutdownOutputpublic void shutdownOutput()()
26、 这些方法都将抛出例外IOException,程序中需要捕获处理。 关闭Socket:public void close() throws IOExceptionpublic void close() throws IOException 设置/获取Socket数据public InetAddress getInetAddresspublic InetAddress getInetAddress()()、public int getPortpublic int getPort()(),public void setSoTimeout(intpublic void setSoTimeout(in
27、ttimeout)timeout), 这些方法都将抛出例外SocketException,程序中需要捕获处理。264.2.2 Socket演示案例-Socketn 背景介绍在本部分讨论的示例将阐明在 Java 代码中如何使用 Socket 和 ServerSocket。客户机用 Socket 连接到服务器。服务器用 ServerSocket 在端口 3000 侦听。客户机请求服务器 C: 驱动器上的文件内容。为清楚起见,我们把示例分解成客户机端和服务器端。最后我们将把它们组合起来以使您能看到整体模样。注:客户机和服务器将只在一台机器上运行,所以您不必担心是否有一个可用的网络。 274.2.2
28、Socket演示案例-Socketn 背景介绍下面是整个类的结构:服务器IP地址变量网络连接端口创建连接等操作获取文件284.2.2 Socket演示案例-Socketn 建立连接建立连接 实例化一个socket对象将socket的输入输出流进行封装294.2.2 Socket演示案例-Socketn 与主机进行交互它将告诉服务器我们想要什么文件并在服务器传回其内容时接收该内容。 向服务器发送消息从服务器接收内容304.2.2 Socket演示案例-Socketn 断开连接tearDownConnection() 方法只是分别关闭我们在 Socket 的 InputStream 和 Outpu
29、tStream 上创建的 BufferedReader 和 PrintWriter。这样做会关闭我们从这样做会关闭我们从 Socket 获取的底层流获取的底层流,所以我们必须捕捉可能的 IOException。思考:思考:1.1.为什么这么没有调用为什么这么没有调用socket.closesocket.close()()方法方法? ? 2. 2.怎么实现怎么实现main()main()方法或方法或JunitJunit单元测试用例单元测试用例! !314.2.2 Socket演示案例-Socketn客户端操作总结在这里我们回顾一下创建和使用 Socket 的步骤: 1.用您想连接的机器的 IP
30、地址和端口实例化 Socket(如有问题则抛出 Exception)。 2.获取 Socket 上的流以进行读写。把流包装进 BufferedReader/PrintWriter 的实例 。3.对 Socket 进行读写 。4.关闭打开的流。 324.3.1 ServerSocket类主要方法介绍n 构造方法:public ServerSocket(intpublic ServerSocket(intport)port)public ServerSocket(intpublic ServerSocket(intport, port, intintbacklogbacklog) /) /支持指定
31、支持指定数目的连接数目的连接public ServerSocket(intpublic ServerSocket(intport, intport, intbacklog, backlog, InetAddressInetAddressbindAddrbindAddr) ) /在指定的机器上运行在指定的机器上运行 这些方法都将抛出例外IOException,程序中需要捕获处理n 主要方法:public Socket accept()public Socket accept():等待客户端的连接:等待客户端的连接public void close()public void close():关闭:
32、关闭SocketSocketn 设置/获取Socket数据:public InetAddress getInetAddresspublic InetAddress getInetAddress()()、public int public int getLocalPortgetLocalPort()(),public void setSoTimeout(intpublic void setSoTimeout(inttimeout)timeout), 这些方法都将抛出例外SocketException,程序中需要捕获处理。334.3.2 ServerSocket演示案例n 背景介绍接受客户端的请求
33、,将服务器c盘目录下面的某个文件返回给客户端。n 服务器端类结构接受连接方法业务处理方法344.3.2 ServerSocket演示案例n 接受连接接受连接创建一个 ServerSocket 并等待连接请求 。 实例化一个ServerSocket对象侦听端口并接受请求354.3.2 ServerSocket演示案例n 处理连接处理连接 封装输入输出流业务处理释放相关资源364.3.3 ServerSocket总结回顾一下创建和使用 ServerSocket 的步骤:1.用一个您想让它侦听传入客户机连接的端口来实例化一个 ServerSocket(如有问题则抛出 Exception)。 2.调用
34、 ServerSocket 的 accept() 以在等待连接期间造成阻塞。 3.获取位于该底层 Socket 的流以进行读写操作。按使事情简单化的原则包装流。 4.对 Socket 进行读写。关闭打开的流(并请记住,永远不要在关闭 Writer 之前关闭 Reader)。 思考:思考:1.1.如何实现启动上述服务器端代码如何实现启动上述服务器端代码? ? 2. 2.服务器端如何实现多客户端同时连接服务器端如何实现多客户端同时连接? ?37Socket高级应用一 多线程服务器如何处理多个连接请求?案例分析二 带连接池的服务器背景分析案例分析385.1.1如何处理多个连接请求?处理方法:将服务器
35、写成多线程的,不同的处理线程为不同的客户服务。主线程只负责循环等待,处理线程负责网络连接,接收客户输入的信息。Serverclient1client2serverthread2serverthread1395.1.2 案例分析n 接受连接请求我们将在前面所讲的服务器端的案例进行重构,将期重构成一个满足成多并发服务器程序。指定客户机请求的最大数目 变化重点所在405.1.2 案例分析n 处理连接:第处理连接:第 1 1 部分部分 这里我们将讨论 handleConnection() 方法的结构,这个方法生成一个新的 Thread 来处理每个连接。我们将分两部分讨论这个问题。这一屏我们将着重该方法
36、本身,然后在下一屏研究该方法所使用的 ConnectionHandler 助手类的结构。 思考思考:1.:1.与单并发处理的区别与单并发处理的区别? ? 2.ConnectionHandler 2.ConnectionHandler应该怎么实现应该怎么实现? ?415.1.2 案例分析n 处理连接:第处理连接:第 2 2 部分部分我们对我们对 RemoteFileServer RemoteFileServer 所做的大改动就体现所做的大改动就体现在这个方法上。我们仍然在服务器接受一个连接之后在这个方法上。我们仍然在服务器接受一个连接之后调用调用 handleConnection()handle
37、Connection(),但现在我们把该,但现在我们把该 Socket Socket 传递给传递给 ConnectionHandler ConnectionHandler 的一个实例,它是的一个实例,它是 Runnable Runnable 的。我们用的。我们用 ConnectionHandler ConnectionHandler 创建一个创建一个新新 Thread Thread 并启动它。并启动它。ConnectionHandler ConnectionHandler 的的 run() run() 方法包含方法包含Socket Socket 读写和读读写和读 File File 的代码,这
38、些代码的代码,这些代码原来在原来在 RemoteFileServerRemoteFileServer 的的 handleConnection() handleConnection() 中中。思考:如何实现run()方法?与前面的任务有什么区别吗与前面的任务有什么区别吗? ?425.1.3 案例分析总结创建和使用“多线程版”的服务器的步骤:一 修改 acceptConnections() 以用缺省为 50(或任何您想要的大于 1 的指定数字)实例化ServerSocket。 二 修改 ServerSocket 的 handleConnection() 以用 ConnectionHandler 的
39、一个实例生成一个新的 Thread。 三 借用 RemoteFileServer 的 handleConnection() 方法的代码实现 ConnectionHandler 类。 43神秘的套接字一 现实生活中的套接字客户端原理服务器端原理发送消息到服务器端原理接收客户端的消息原理总结二 java平台套接字实现URLConnection类Socket类ServerSocket类三总结441.2.1 现实生活中的套接字n 客户端原理我们创建了一个 ClientSocketFacade,它是 Runnable 的并且拥有一个 Socket 实例。我们的应用程序可以用一个特定的主机 IP 地址和端
40、口号来实例化一个 ClientSocketFacade,并在一个新 Thread 中运行它。ClientSocketFacade 的 run() 方法调用 connect(),connect() 惰性初始化一个 Socket。有了 Socket 实例,我们的 ClientSocketFacade 就调用自己的 receive(),receive() 将造成阻塞直到服务器在 Socket 上发送数据。一旦服务器发送数据,我们的 ClientSocketFacade 就将醒来并处理传入的数据。数据的发送是直接的。我们的应用程序可以通过用一个 StreamObject 调用 send() 方法来简单
41、地告诉它的 ClientSocketFacade 把数据发送到服务器。上述讨论中唯一遗漏的一个是 StreamAdapter。当应用程序告诉 ClientSocketFacade 发送数据时,该 Facade 将委派 StreamAdapter 的实例处理有关操作。ClientSocketFacade 委派 StreamAdapter 的同一个实例处理接收数据的操作。StreamAdapter 把消息加工成最终格式并将它放到 Socket 的 OutputStream 上,并以逆过程处理从 Socket 的 InputStream 传入的消息。例如,或许您的服务器需要知道发送中的消息的字节数。
42、StreamAdapter 可以在发送之前计算消息的长度并将它附加在消息的前端。当服务器接收消息时,同样的 StreamAdapter 能够剥离长度信息并读取正确数量的字节以构建一个 StreamReadyObject。451.2.1 现实生活中的套接字n 服务器端原理我们把 ServerSocket 包装进 ServerSocketFacade,ServerSocketFacade 是 Runnable 的并且拥有一个 ServerSocket 实例。我们的应用程序可以用一个特定的服务器端侦听端口和客户机连接的最大允许数目(缺省值是 50)来实例化一个 ServerSocketFacade。
43、应用程序然后在一个新 Thread 中运行 Facade 以隐藏 ServerSocket 的交互操作细节。ServerSocketFacade 上的 run() 方法调用 acceptConnections(),acceptConnections() 创建一个新的 ServerSocket,并调用 ServerSocket 上的 accept() 以造成阻塞直到有客户机请求一个连接。每当有客户机请求连接,我们的 ServerSocketFacade 就醒来并通过调用 handleSocket() 来把 accept() 返回的新 Socket 传递给 SocketHandler 的实例。So
44、cketHandler 的分内工作是处理从客户机到服务器的新通道。461.2.1 现实生活中的套接字n 发送消息到服务器端原理发送消息的 UML 交互作用图 471.2.1 现实生活中的套接字n 接收来自服务器的消息接收来自服务器的消息 481.2.1 现实生活中的套接字n 总结Java 语言简化了套接字在应用程序中的使用。它的基础实际上是 包中的 Socket 和 ServerSocket 类。一旦您理解了表象背后发生的情况,就能容易地使用这些类。在现实生活中使用套接字只是这样一件事,即通过贯彻优秀的 OO 设计原则来保护应用程序中各层间的封装。我们为您展示了一些有帮助的类。这些类的结构对我
45、们的应用程序隐藏了 Socket 交互作用的低级细节 使应用程序能只使用可插入的 ClientSocketFacade 和 ServerSocketFacade。在有些地方(在 Facade 内),您仍然必须管理稍显杂乱的字节细节,但您只须做一次就可以了。更好的是,您可以在将来的项目中重用这些低级别的助手类。495.2 带连接池的服务器n 背景分析我们现在已经拥有的 MultithreadedServer 每当有客户机申请一个连接时都在一个新 Thread 中创建一个新 ConnectionHandler。这意味着可能有一捆 Thread “躺”在我们周围。而且创建 Thread 的系统开销并
46、不是微不足道的。如果性能成为了问题(也请不要事到临头才意识到它),更高效地处理我们的服务器是件好事。那么,我们如何更高效地管理服务器端呢?我们可以维护一个进入的连接池,一定数量的 ConnectionHandler 将为它提供服务。这种设计能带来以下好处:l 它限定了允许同时连接的数目。 l 我们只需启动 ConnectionHandler Thread 一次 。 我们在服务器启动时创建一定数量的 ConnectionHandler,我们把进入的连接放入“池”中并让 ConnectionHandler 打理剩下的事情。 505.2 带连接池的服务器带线程池的服务器类结构1.同时处理的活动客户机
47、连接的最大数目 2.进入的连接的侦听端口 3.将接受客户机连接请求的 ServerSocket 1.启动线程池2.接受连接请求515.2 带连接池的服务器n 建立连接处理程序建立连接处理程序-setUpHandlers-setUpHandlers()()方法的实现: setUpHandlers() 方法创建 maxConnections(例如 3)个 PooledConnectionHandler 并在新 Thread 中激活它们。用实现了 Runnable 的对象来创建 Thread 使我们可以在 Thread 调用 start() 并且可以期望在 Runnable 上调用了 run()。换句话说,我们的 PooledConnectionHandler 将等着处理进入的连接,每个都在它自己的 Thread 中进行。 思考:PooledConnectionHandler类如何实现?需要处理哪些业务?525.2 带连接池的服务器PooledConnectionHandler的类结构:该类有两个实例变量: 1. connection 是当前正在处理的 Socket 2. 名为 pool 的静态 LinkedList 保存需被处理的连接 将把传入请求添加到池中,将把传入请求添加到池中,并告诉其它正在等待的对象并告诉其它正在等待的对象该
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国车泵变径管数据监测报告
- 2025-2030年中国EL冷光片行业市场营运趋势与投资价值评估报告
- 2025至2031年中国磁泥聚集车行业投资前景及策略咨询研究报告
- 2025至2031年中国病毒灵行业投资前景及策略咨询研究报告
- 2025至2031年中国眼镜收纳盒行业投资前景及策略咨询研究报告
- 2025至2031年中国真丝镶金围巾行业投资前景及策略咨询研究报告
- 五洋营销策划报告
- 2025至2031年中国电子式邮件炸弹扫描机行业投资前景及策略咨询研究报告
- 中职语文高教版《哦香雪》同步练习含答案
- 学习安全工作心得体会
- GB/T 12759-1991双圆弧圆柱齿轮基本齿廓
- GB/T 11864-2008船用轴流通风机
- GB 2759-2015食品安全国家标准冷冻饮品和制作料
- 加速康复外科(ERAS)骨科患者疼痛知识、术后疼痛机体影响和阵痛原则方法
- 监理工程师通知回复单11
- 禁毒学校青少年预防远离毒品教育模板课件
- 合同交底范本课件
- 阿玛松气吸式精量播种机课件
- 汽车4S店售后回访流程
- 试卷讲评课市公开课一等奖市公开课一等奖省名师优质课赛课一等奖课件
- 新人教版八年级下册《生物》期中试卷及答案
评论
0/150
提交评论