socket性能优化
serversocket 例子

一、什么是ServerSocket?在计算机网络编程中,ServerSocket是一种用于监听客户端连接请求的服务器端套接字。
通过创建ServerSocket对象,程序可以在指定的端口上监听客户端的连接,并接受客户端发起的连接请求。
一旦建立连接,程序可以通过ServerSocket接受客户端的请求,并与客户端进行数据交换。
二、ServerSocket的基本用法1. 创建ServerSocket对象要创建ServerSocket对象,可以使用以下代码:```javaServerSocket serverSocket = new ServerSocket(8888);```这段代码创建了一个ServerSocket对象,并让其在8888端口上监听客户端的连接请求。
2. 监听客户端连接要监听客户端的连接请求,可以使用以下代码:```javaSocket clientSocket = serverSocket.accept();```这段代码会阻塞程序,直到有客户端发起连接请求。
一旦有客户端连接进来,accept()方法会返回一个Socket对象,程序可以通过这个Socket对象与客户端进行通信。
3. 数据交换一旦建立连接,程序可以通过Socket对象与客户端进行数据交换。
可以使用InputStream和OutputStream来读取客户端发送的数据或向客户端发送数据。
```javaInputStream inputStream = clientSocket.getInputStream(); OutputStream outputStream = clientSocket.getOutputStream(); // 读取客户端发送的数据// 向客户端发送数据```三、ServerSocket的实际应用ServerSocket在实际的网络编程中发挥着重要的作用。
一个基于Socket通信的服务器程序通常会使用ServerSocket来监听客户端的连接请求,并在客户端连接时创建一个新的线程来处理与客户端的通信。
深度解密TCP协议(三次握手、四次挥手、拥塞控制、性能优化)

深度解密TCP协议(三次握⼿、四次挥⼿、拥塞控制、性能优化)楔⼦巨⼈的肩膀:公众号《⼩林 coding》随着你⼯作经验的积累,你会越来越意识到底层⽹络协议的重要性。
⽐如我们时时刻刻在使⽤的 HTTP 协议其实只负责包装数据,并不负责数据传输,真正负责传输的是 TCP/IP 协议;再⽐如我们使⽤的 Web 框架,它们本质上就是⼀个 socket,⽽ socket ⼜是对 TCP/IP 协议的⼀个封装,可以让我们更⽅便地使⽤ TCP/IP 协议,⽽不⽤关注背后的原理。
注:socket 不是什么协议,也不属于 "四层" 或 "七层" 中的任意⼀层,它只是⼀组调⽤接⼝,对 TCP/IP 协议栈进⾏了⼀个封装。
如果⾮要把 socket 放到 OSI 七层模型中的话,那么可以把它看成是位于「应⽤层」和「传输层」之间的⼀个抽象层。
所以⼀切都指向了 TCP/IP 协议,如果想成为⼀个⾼⼿的话,那么 TCP/IP 协议是必须要了解的。
特别是⼤⼚,⾯试官⼏乎不会问题某个框架怎么使⽤,更喜欢问你底层的 TCP/IP 协议。
那么接下来我们就来看看 TCP/IP 中的 TCP。
认识 TCPTCP 是⾯向连接的、可靠的、基于字节流的传输层通信协议。
⾯向连接:⼀定是「⼀对⼀」才能连接,不能像 UDP 协议那样可以⼀个主机同时向多个主机发送消息,也就是⼀对多是⽆法做到的;可靠的:⽆论的⽹络链路中出现了怎样的链路变化,TCP 都可以保证⼀个报⽂⼀定能够到达接收端;字节流:消息是「没有边界」的,所以⽆论我们消息有多⼤都可以进⾏传输。
并且消息是「有序的」,当「前⼀个」消息没有收到的时候,即使后⾯的字节已经收到,那么也不能扔给应⽤层去处理,同时对「重复」的报⽂会⾃动丢弃;我们来看看 TCP 报⽂格式,相⽐ HTTP 报⽂(Header + Body),TCP 报⽂就显得复杂许多。
序列号:在建⽴连接时由计算机⽣成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送⼀次数据,就「累加」⼀次该「数据字节数」的⼤⼩。
socket通讯如何接收服务器返回的数据

socket通讯如何接收服务器返回的数据在进行Socket通信中,接收服务器返回的数据是非常重要的一步。
本文将介绍如何有效地接收服务器返回的数据,以确保通信的顺利进行。
一、理解Socket通信的基本原理Socket通信是一种在网络中实现进程间通信的方式。
在Socket通信中,客户端和服务器通过建立网络连接进行数据的传输。
客户端首先与服务器建立连接,然后发送请求,服务器接收到请求后进行处理,并将结果返回给客户端。
二、接收服务器返回的数据的方法在接收服务器返回的数据之前,我们需要先建立好Socket连接,并发送请求。
以下是几种常用的接收服务器返回数据的方法。
1. 通过inputStream接收数据通过inputStream可以从Socket连接中获取服务器返回的数据。
我们可以使用inputStream的read()方法读取数据,read()方法会返回一个int类型的值,表示读到的数据的字节表示。
当返回值为-1时,表示数据已经读取完毕。
2. 通过BufferedReader接收数据使用BufferedReader可以更方便地接收服务器返回的数据。
我们可以使用BufferedReader的readLine()方法逐行读取服务器返回的数据,readLine()方法会将读到的数据以String类型返回。
同样,当返回值为null时,表示数据已经读取完毕。
3. 通过DataInputStream接收数据如果我们预先知道服务器返回数据的格式,可以使用DataInputStream进行数据的接收。
DataInputStream提供了一系列的read方法,可以按照指定的格式读取数据。
比如,我们可以使用readInt()方法读取一个int类型的数据,使用readUTF()方法读取一个UTF-8编码的字符串。
4. 通过ObjectInputStream接收对象数据如果服务器返回的是一个复杂的对象,我们可以使用ObjectInputStream进行数据的接收。
socket测试方案

Socket测试方案1. 引言Socket是一种在计算机网络中用于实现进程间通信的一种机制。
在网络通信的应用场景中,Socket是一种常用的通信方式。
为了确保Socket通信的可靠性和稳定性,有必要进行Socket测试以验证其性能和功能。
本文档将介绍一种基本的Socket测试方案,其中包括测试目的、测试环境、测试步骤和测试结果的分析等内容。
2. 测试目的Socket测试的主要目的是验证Socket通信的性能和稳定性,具体包括以下几个方面:1.确保Socket连接的建立和断开正常。
2.验证Socket数据传输的可靠性和稳定性。
3.评估Socket通信的性能,包括延迟、吞吐量和并发性能等指标。
通过Socket测试,可以从整体上了解应用程序的网络通信性能,发现潜在的问题并进行相应的优化。
3. 测试环境在进行Socket测试之前,需要设置好适当的测试环境,包括以下几个方面:1.服务器端和客户端的设备,可以是物理机或者虚拟机。
2.操作系统,可以是Windows、Linux或者其他适用的操作系统。
3.网络环境,确保服务器端和客户端能够正常通信。
4. 测试步骤4.1 创建服务器端首先需要创建一个服务器端的Socket程序,负责监听客户端的连接请求并进行处理。
可以使用Java、Python等编程语言来实现服务器端。
以下为一个使用Python的示例代码:import socket# 创建一个TCP socket对象server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定服务器端的IP地址和端口号server_address = ('localhost', 8080)server_socket.bind(server_address)# 监听客户端的连接请求server_socket.listen(5)while True:# 接受客户端的连接请求client_socket, client_address = server_socket.accept() # 处理客户端请求的逻辑# ...# 关闭客户端的连接client_socket.close()# 关闭服务器端的socket对象server_socket.close()4.2 创建客户端接下来需要创建一个客户端的Socket程序,负责向服务器端发送请求并接收服务器端的响应。
基于Linux的Socket网络编程及性能优化

福建电脑2012年第12期基于Linux的Socket网络编程及性能优化马丽洁(内蒙古电子信息职业技术学院内蒙古呼和浩特010070)【摘要】:本文主要从Socket的建立、配置、连接、数据传输和结束通信五个方面阐述了基于Linux的Socket网络编程的方法和步骤,最后又从最小化报文传输延迟、最小化系统调用负载、为Bandwidth Delay Product调节tcp窗口、动态优化GNU/linux TCP/IP协议栈四个方面进行性能优化,以使应用程序高效、稳定。
【关键词】:Linux,Socket,网络编程,性能优化Socket的英文原义是“孔”或“插座”,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。
在Internet上的主机一般运行了多个服务软件,同时提供几种服务。
每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。
Socket正如其英文原意那样,象一个多孔插座。
一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。
客户软件将插头插到不同编号的插座,就可以得到不同的服务。
socket也是一种文件描述符。
1.Socket编程1.1Socket的建立为了建立Socket,程式能够调用Socket函数,该函数返回一个类似于文档描述符的句柄。
Socket描述符是个指向内部数据结构的指针,他指向描述符表入口。
调用Socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket"意味着为一个Socket数据结构分配存储空间。
Socket执行体为您管理描述符表。
两个网络程式之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。
Socket数据结构中包含这五种信息。
1.2Socket的配置通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。
socket 读写 超时 详解

socket 读写超时详解摘要:1.概述2.Socket 读写超时的原因3.Socket 读写超时的解决方法4.总结正文:1.概述在网络编程中,Socket 是一种应用层协议,它提供了一个应用程序与网络之间的接口,使得数据能够在网络中进行传输。
在使用Socket 进行网络通信时,可能会遇到读写超时的问题。
本文将详细解释Socket 读写超时的原因,并提供相应的解决方法。
2.Socket 读写超时的原因Socket 读写超时通常是由于以下原因导致的:(1) 网络拥堵:当网络中的数据包数量过多,导致网络拥堵时,数据包的传输速度会降低,从而导致Socket 读写超时。
(2) 服务器负载过高:当服务器的负载过高时,它可能无法及时响应客户端的请求,从而导致Socket 读写超时。
(3) 网络故障:当网络出现故障时,数据包的传输可能会受到影响,从而导致Socket 读写超时。
(4) 程序错误:当程序中存在错误时,可能会导致Socket 读写超时。
3.Socket 读写超时的解决方法针对Socket 读写超时的问题,可以采取以下措施进行解决:(1) 优化网络环境:尽量避免在网络拥堵的时段进行数据传输,或者使用质量更高的网络线路。
(2) 提高服务器性能:通过提高服务器的性能,可以降低服务器的负载,从而提高其响应速度。
(3) 调整Socket 超时设置:通过调整Socket 的超时设置,可以增加读写操作的时间,从而减少超时发生的概率。
在设置超时时间时,需要根据实际情况进行调整,以保证既能减少超时发生的概率,又不会影响程序的性能。
(4) 检查程序代码:通过检查程序代码,可以发现并修复程序中存在的错误,从而避免Socket 读写超时的问题。
4.总结Socket 读写超时是网络编程中常见的问题,它可能会导致程序无法正常运行。
socket tcp keepalive机制

标题:探讨Socket TCP KeepAlive机制的作用和实现方式1.概述在计算机网络编程中,Socket TCP KeepAlive机制是一个非常重要的概念。
它可以确保网络连接的稳定性和可靠性,同时可以避免因网络异常而导致的连接中断和数据丢失问题。
2.TCP协议的连接保活机制TCP协议是一种面向连接的协议,它通过三次握手建立连接,并提供可靠的数据传输服务。
在TCP连接建立后,如果在一段时间内没有数据传输,TCP连接就会被视为空闲连接,这时候就需要通过心跳包来确认对端的存活状态。
3.Socket TCP KeepAlive机制的作用Socket TCP KeepAlive机制可以确保连接的存活状态。
当一端意外关闭或者网络异常导致连接中断时,KeepAlive机制可以及时检测到连接的异常并进行处理,从而保证数据传输的可靠性和稳定性。
4.KeepAlive机制的实现方式在TCP连接建立后,可以通过设置SO_KEEPALIVE选项来启用KeepAlive机制。
通过设置KeepAlive的相关参数,如KeepAlive时间间隔、KeepAlive尝试次数等,可以调整KeepAlive机制的工作方式,以适应不同的网络环境和需求。
5.如何优化Socket TCP KeepAlive机制为了提高KeepAlive机制的效率和性能,可以根据实际情况进行一些优化。
可以根据网络延迟和稳定性调整KeepAlive时间间隔和尝试次数,以确保及时发现连接异常;还可以结合其他技术手段,如心跳检测、断线重连等,以提高连接的稳定性和可靠性。
6.总结Socket TCP KeepAlive机制是保障网络连接稳定性和可靠性的重要手段。
通过了解其作用、实现方式和优化方法,可以更好地应用和调整KeepAlive机制,以确保网络连接的稳定和可靠。
7.参考文献- Understanding TCP/IP Network Performance and Security, Mark A. Miller- TCP/IP Illustrated, Volume 1: The Protocols, W. Richard Stevens- The Linux Programming Interface, Michael Kerrisk8. KeepAlive 机制与网络性能优化除了保证连接的稳定性和可靠性外,KeepAlive机制还可以与网络性能优化相结合,进一步提升应用程序的用户体验和系统的效率。
hpsocket默认封包规则

HPSocket默认封包规则报告一、引言HPSocket是一个广泛使用的网络通信库,它提供了一种高效、稳定的TCP/IP网络通信解决方案。
在HPSocket中,默认的封包规则对于网络通信的性能和稳定性具有重要影响。
本报告将详细介绍HPSocket的默认封包规则,并分析其优缺点。
二、HPSocket默认封包规则1.封包格式HPSocket默认使用二进制封包格式,这种格式能够确保数据传输的完整性和一致性。
二进制封包格式的头部包含了长度、标志位等信息,用于指示封包的大小和类型。
2.封包大小HPSocket默认封包大小为2KB,这意味着每个封包最多可以包含2KB的数据。
这种设置可以根据实际需求进行调整,但过小的封包大小可能导致网络拥塞,而过大的封包大小则可能导致传输效率降低。
3.缓冲区分配HPSocket使用内部的缓冲区来存储待发送和已接收的数据。
默认情况下,缓冲区的大小为2MB,可以根据需要进行调整。
缓冲区的大小对于网络通信的性能和稳定性具有重要影响。
4.流量控制HPSocket默认使用TCP流量控制机制,通过滑动窗口算法来控制发送和接收的数据量。
这种机制可以确保网络通信的稳定性和可靠性。
三、优缺点分析1.优点(1)二进制封包格式保证了数据传输的完整性和一致性;(2)默认的封包大小可以根据实际需求进行调整;(3)内部的缓冲区可以有效地提高网络通信的性能;(4)TCP流量控制机制可以确保网络通信的稳定性和可靠性。
2.缺点(1)过小的封包大小可能导致网络拥塞;(2)过大的封包大小可能导致传输效率降低;(3)缓冲区的大小需要根据实际需求进行调整,否则可能导致性能问题;(4)TCP流量控制机制可能受到网络延迟等因素的影响,导致通信效率降低。
四、结论与建议HPSocket的默认封包规则在保证数据传输的完整性和一致性方面具有优势,但也存在一些缺点。
在实际应用中,需要根据具体需求对封包大小、缓冲区大小等参数进行调整,以优化网络通信的性能和稳定性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
socket性能优化M. Tim Jones (), 资深软件工程师, Emulex使用 Sockets API,我们可以开发客户机和服务器应用程序,它们可以在本地网络上进行通信,也可以通过 Internet 在全球范围内进行通信。
与其他 API 一样,您可以通过一些方法使用 Sockets API,从而提高 Socket 的性能,或者限制 Socket 的性能。
本文探索了 4 种使用 Sockets API 来获取应用程序的最大性能并对GNU/Linux® 环境进行优化从而达到最好结果的方法。
在开发 socket 应用程序时,首要任务通常是确保可靠性并满足一些特定的需求。
利用本文中给出的 4 个提示,您就可以从头开始为实现最佳性能来设计并开发socket 程序。
本文内容包括对于 Sockets API 的使用、两个可以提高性能的socket 选项以及 GNU/Linux 优化。
为了能够开发性能卓越的应用程序,请遵循以下技巧:∙最小化报文传输的延时。
∙最小化系统调用的负载。
∙为 Bandwidth Delay Product 调节 TCP 窗口。
∙动态优化 GNU/Linux TCP/IP 栈。
技巧 1. 最小化报文传输的延时在通过 TCP socket 进行通信时,数据都拆分成了数据块,这样它们就可以封装到给定连接的 TCP payload(指 TCP 数据包中的有效负荷)中了。
TCP payload 的大小取决于几个因素(例如最大报文长度和路径),但是这些因素在连接发起时都是已知的。
为了达到最好的性能,我们的目标是使用尽可能多的可用数据来填充每个报文。
当没有足够的数据来填充 payload 时(也称为最大报文段长度(maximum segment size)或 MSS),TCP 就会采用 Nagle 算法自动将一些小的缓冲区连接到一个报文段中。
这样可以通过最小化所发送的报文的数量来提高应用程序的效率,并减轻整体的网络拥塞问题。
尽管 John Nagle 的算法可以通过将这些数据连接成更大的报文来最小化所发送的报文的数量,但是有时您可能希望只发送一些较小的报文。
一个简单的例子是 telnet 程序,它让用户可以与远程系统进行交互,这通常都是通过一个shell 来进行的。
如果用户被要求用发送报文之前输入的字符来填充某个报文段,那么这种方法就绝对不能满足我们的需要。
另外一个例子是 HTTP 协议。
通常,客户机浏览器会产生一个小请求(一条 HTTP 请求消息),然后 Web 服务器就会返回一个更大的响应(Web 页面)。
解决方案您应该考虑的第一件事情是 Nagle 算法满足一种需求。
由于这种算法对数据进行合并,试图构成一个完整的 TCP 报文段,因此它会引入一些延时。
但是这种算法可以最小化在线路上发送的报文的数量,因此可以最小化网络拥塞的问题。
但是在需要最小化传输延时的情况中,Sockets API 可以提供一种解决方案。
要禁用 Nagle 算法,您可以设置 TCP_NODELAY socket 选项,如清单 1 所示。
清单 1. 为 TCP socket 禁用 Nagle 算法int sock, flag, ret;/* Create new stream socket */sock = socket( AF_INET, SOCK_STREAM, 0 );/* Disable the Nagle (TCP No Delay) algorithm */flag = 1;ret = setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag) );if (ret == -1) { printf("Couldn'tsetsockopt(TCP_NODELAY)\n"); exit(-1);}提示:使用 Samba 的实验表明,在从Microsoft® Windows® 服务器上的 Samba 驱动器上读取数据时,禁用 Nagle 算法几乎可以加倍提高读性能。
技巧 2. 最小化系统调用的负载任何时候通过一个 socket 来读写数据时,您都是在使用一个系统调用(system call)。
这个调用(例如 read 或 write)跨越了用户空间应用程序与内核的边界。
另外,在进入内核之前,您的调用会通过 C 库来进入内核中的一个通用函数(system_call())。
从 system_call() 中,这个调用会进入文件系统层,内核会在这儿确定正在处理的是哪种类型的设备。
最后,调用会进入 socket 层,数据就是在这里进行读取或进行排队从而通过 socket 进行传输的(这涉及数据的副本)。
这个过程说明系统调用不仅仅是在应用程序和内核中进行操作的,而且还要经过应用程序和内核中的很多层次。
这个过程耗费的资源很高,因此调用次数越多,通过这个调用链进行的工作所需要的时间就越长,应用程序的性能也就越低。
由于我们无法避免这些系统调用,因此惟一的选择是最小化使用这些调用的次数。
幸运的是,我们可以对这个过程进行控制。
解决方案在将数据写入一个 socket 时,尽量一次写入所有的数据,而不是执行多次写数据的操作。
对于读操作来说,最好传入可以支持的最大缓冲区,因为如果没有足够多的数据,内核也会试图填充整个缓冲区(另外还需要保持 TCP 的通告窗口为打开状态)。
这样,您就可以最小化调用的次数,并可以实现更好的整体性能。
技巧 3. 为 Bandwidth Delay Product 调节 TCP 窗口TCP 的性能取决于几个方面的因素。
两个最重要的因素是链接带宽(link bandwidth)(报文在网络上传输的速率)和往返时间(round-trip time)或RTT(发送报文与接收到另一端的响应之间的延时)。
这两个值确定了称为Bandwidth Delay Product(BDP)的内容。
给定链接带宽和 RTT 之后,您就可以计算出 BDP 的值了,不过这代表什么意义呢?BDP 给出了一种简单的方法来计算理论上最优的 TCP socket 缓冲区大小(其中保存了排队等待传输和等待应用程序接收的数据)。
如果缓冲区太小,那么 TCP 窗口就不能完全打开,这会对性能造成限制。
如果缓冲区太大,那么宝贵的内存资源就会造成浪费。
如果您设置的缓冲区大小正好合适,那么就可以完全利用可用的带宽。
下面我们来看一个例子:BDP = link_bandwidth * RTT如果应用程序是通过一个 100Mbps 的局域网进行通信,其 RRT 为 50 ms,那么BDP 就是:100MBps * 0.050 sec / 8 = 0.625MB = 625KB注意:此处除以 8 是将位转换成通信使用的字节。
因此,我们可以将 TCP 窗口设置为 BDP 或 1.25MB。
但是在 Linux 2.6 上默认的 TCP 窗口大小是 110KB,这会将连接的带宽限制为 2.2MBps,计算方法如下:throughput = window_size / RTT110KB / 0.050 = 2.2MBps如果使用上面计算的窗口大小,我们得到的带宽就是 12.5MBps,计算方法如下:625KB / 0.050 = 12.5MBps差别的确很大,并且可以为 socket 提供更大的吞吐量。
因此现在您就知道如何为您的 socket 计算最优的缓冲区大小了。
但是又该如何来改变呢?解决方案Sockets API 提供了几个 socket 选项,其中两个可以用于修改 socket 的发送和接收缓冲区的大小。
清单 2 展示了如何使用 SO_SNDBUF 和 SO_RCVBUF 选项来调整发送和接收缓冲区的大小。
注意:尽管 socket 缓冲区的大小确定了通告 TCP 窗口的大小,但是 TCP 还在通告窗口内维护了一个拥塞窗口。
因此,由于这个拥塞窗口的存在,给定的socket 可能永远都不会利用最大的通告窗口。
清单 2. 手动设置发送和接收 socket 缓冲区大小int ret, sock, sock_buf_size;sock = socket( AF_INET, SOCK_STREAM,0 );sock_buf_size = BDP;ret = setsockopt( sock, SOL_SOCKET, SO_SNDBUF, (char *)&sock_buf_size, sizeof(sock_buf_size) );ret = setsockopt( sock, SOL_SOCKET, SO_RCVBUF, (char *)&sock_buf_size, sizeof(sock_buf_size) );在 Linux 2.6 内核中,发送缓冲区的大小是由调用用户来定义的,但是接收缓冲区会自动加倍。
您可以进行 getsockopt 调用来验证每个缓冲区的大小。
巨帧(jumbo frame)我们还可以考虑将包的大小从 1,500 字节修改为 9,000 字节(称为巨帧)。
在本地网络中可以通过设置最大传输单元(Maximum Transmit Unit,MTU)来设置巨帧,这可以极大地提高性能。
就 window scaling 来说,TCP 最初可以支持最大为 64KB 的窗口(使用 16 位的值来定义窗口的大小)。
采用 window scaling(RFC 1323)扩展之后,您就可以使用 32 位的值来表示窗口的大小了。
GNU/Linux 中提供的 TCP/IP 栈可以支持这个选项(以及其他一些选项)。
提示:Linux 内核还包括了自动对这些 socket 缓冲区进行优化的能力(请参阅下面表 1中的 tcp_rmem 和 tcp_wmem),不过这些选项会对整个栈造成影响。
如果您只需要为一个连接或一类连接调节窗口的大小,那么这种机制也许不能满足您的需要了。