今天有时间重新温习了一下socket,既然温习了总得总结一下吧!
首现Socket有几个选项:
1、TCP_NODELAY:表示立即发送数据。
2、SO_RESUSEADDR:表示允许重用Socket所绑定的本地地址
3、SO_TIMEOUT:表示接受数据时的超时时间。
4、SO_LINGER:表示当执行close();方法时候,是否理解关闭底层的socket。
5、SO_SNFBUF:表示发送数据的缓冲大小
6、SO_RCVBUF:表示接受数据的缓冲区的大小
7、SO_KEEPALIVE:表示长时间处于空闲状态的SOCEKT,是否自动把他/她关闭
8、OOBINLINE:表示是否支持发送一个字节的TCP紧急数据
那我们就详细解释一下以上选项的作用:
1、TCP_NODELAY选项:
setTcpNoDelay(boolean on);
默认情况下发送数据是采用Negale算法。Negale算法是指发送方数据不会立刻发送出去,而是先放在缓冲区内,等待缓冲区满了,在发出去。Negale算法适用于需要发送大量数据的应用场景。这种算法减少传输的次数增加性能。但是如果对于需要即使响应的,小批量数据的应用场景,例如网络游戏就不能采用Negale算法了。默认是false,表示采用Negale算法。
2、SO_RESUSEADDR选项:
setResuseAddress(boolean on);
当接收方通过socket的close()方法关闭socket的时候,如果网络还在发送数据,那么底层的socket不会立即释放本地的端口的,而是等一段时间,确定保证接收到了网络上的延迟数据,然后在释放端口。确保正好不被同样的socket占用这个端口号。
3、SO_TIMEOUT选项:
setSoTimeout(int milins);
用于设置接受数据的等待的超时时间,单位为毫秒,它的默认值是0,表示无限等待。
4、SO_LINGER选项
setSoLinger(boolean on ,int seconds);
默认情况socket的close();方法会立即返回。但是底层的socket并没有立即关闭,他会延迟一段时间,等发送完毕了再关闭。如果执行:
setSoLinger(true,0)的话,会立即关闭,底层的socket也会立即关闭,丢切剩余的数据。如果setSoLinger(true,3600);会在两种情况关闭,第一:数据发送完毕,第二:就是阻塞了3600秒。
5、SO_RCVBUF选项
setReceiveBufferSize(int size);
用于设置输入数据的缓冲区的大小。传输较大的可以使用较大的缓冲区(例如:http,ftp),例如网络游戏实时性较高的,且频繁交互的使用较小的缓冲区。
6、SO_SNDBUF选项
setSendBufferSize(int size);
用于设置输出缓冲区的大小。
7、SO_KEEPALIVE选项
setKeepAlive(boolean on);
当设置为true的时候,TCP会实现监控连接是否有效,当连接处于空闲状态的时候,超过了2个小时,本地的TCP实现会发送一个数据包给远程的socket,如果远程没有发回响应,TCP会持续尝试11分钟,知道响应为止,如果在12分钟的时候还没响应,TCP尝试关闭socket连接。
8、OOBINLINE选项
setOOBInline(boolean on);
当设置为true的时候,表示支持紧急数据。接收方需要对紧急数据做进一步的处理。使用更高的协议。
对于socket服务类型的选择:
IP规定了4中服务类型:
1、低成本:发送成本低
2、高可靠性:保证鲍数据可靠的发送到目的地
3、高吞吐量:一次接受发送大量数据
4、最小延迟:传输数据快,最快发送到目的地
设置服务类型:setTrafficClass(int trafficClass);
底成本:0x02
高可靠:0x04
最高吞吐量:0x08
最小延迟:0x10
关于socket的设置选项总结完毕!
再来一个实例的封装的方法:
private void setSocketParameters(Socket client_sock) throws SocketException {
if (log.isTraceEnabled())
log.trace("[" + local_addr + "] accepted connection from "
+ client_sock.getInetAddress() + ":"
+ client_sock.getPort());
try {
client_sock.setSendBufferSize(send_buf_size);
} catch (IllegalArgumentException ex) {
if (log.isErrorEnabled())
log.error("exception setting send buffer size to "
+ send_buf_size + " bytes", ex);
}
try {
client_sock.setReceiveBufferSize(recv_buf_size);
} catch (IllegalArgumentException ex) {
if (log.isErrorEnabled())
log.error("exception setting receive buffer size to "
+ send_buf_size + " bytes", ex);
}
// 当设置为true的时候,TCP会实现监控连接是否有效,当连接处于空闲状态的时候,
//超过了2个小时,本地的TCP实现会发送一个数据包给远程的socket,如果远程没有发回响应,
//TCP会持续尝试11分钟,知道响应为止,如果在12分钟的时候还没响应,TCP尝试关闭socket连接
client_sock.setKeepAlive(true);
//采用negal算法,有数据立即发送出去
client_sock.setTcpNoDelay(tcp_nodelay);
if (linger > 0)
//关闭socket等待liner毫秒后在关闭,
client_sock.setSoLinger(true, linger);
else
//直到把缓存底层数据发送完毕再关闭socekt连接
client_sock.setSoLinger(false, -1);
}
分享到:
相关推荐
【标题】"HPSocket.Net-develop_hpsocket.net_HPSocket_.net_socket_tcp_" 提供的知识点主要集中在使用C#编程语言实现基于TCP协议的Socket通信上,并且涉及到一个名为"HPSocket.Net"的库。HPSocket.Net是针对.NET...
**SuperSocket库详解** SuperSocket是一款高性能、轻量级的C# Socket服务器开发框架,它为开发者提供了构建基于TCP/IP协议的应用程序的便利工具。在.NET平台上,SuperSocket以其易于扩展和高度定制化的特性,成为了...
6. **《经典SQL语句大全》**:虽然不是直接关于Socket编程,但SQL知识对于处理数据库操作,特别是在构建网络应用时存储和检索数据是必不可少的。 7. **《vb_net socket接收数据》**:专门讨论了VB.NET中如何接收...
Socket 编程详解 在网络编程中,Socket 是一个基本概念, plays a crucial role in building network applications. 在 C# 中,Socket 编程是通过使用 System.Net.Sockets 命名空间中的类和方法来实现的。下面,...
Socket池和Socket连接池是网络编程中的重要概念,主要用于提高应用程序的性能和效率。在处理大量并发网络连接时,传统的单个Socket连接方式可能会导致系统资源的过度消耗,因此引入了Socket池技术。 Socket,全称是...
Socket是网络编程中的一个重要概念,它是基于TCP/IP通信协议实现的一种通信方式,允许两台计算机通过互联网进行双向通信。在Android开发中,我们经常会用到Socket进行客户端与服务器端的数据交换。下面将详细介绍...
**SuperSocket Socket C# 通讯详解** 在C#编程领域,网络通信是一个不可或缺的部分,而SuperSocket则是一个强大且易用的.NET Socket服务器框架。它为开发者提供了构建自定义网络应用服务的基础,使得处理TCP连接变...
Socket编程在IT行业中是网络通信的基础,特别是在C#开发中,`System.Net.Sockets`命名空间提供了Socket类,用于实现客户端和服务器之间的通信。本示例"socketDemo"旨在展示如何创建一个基本的Socket服务器...
"9772.zip_mql_mql4 socket_socket"的标题暗示了这是一个关于MQL4中使用socket套接字进行网络通信的资源包。Socket编程是计算机通信领域中的一个基础概念,它允许不同设备间的进程通过网络进行数据交换。在MQL4中,...
SocketTool(很好用的socket测试工具)
"文档"很可能包含了更多关于SocketTool的使用方法、示例代码和开发细节。 总的来说,SocketTool是一款全面且强大的网络通信工具,它的多功能性和易扩展性使其成为IT专业人士进行网络调试、开发和管理的理想选择。...
在提供的文件名称列表"SocketTest3"中,我们可以推测这可能是一个Socket测试工具的第三个版本,或者包含一系列关于Socket测试的案例或代码示例。使用此类工具,开发者可以更好地理解和优化他们的Socket应用程序,...
**SuperSocket:强大的.NET Socket框架** SuperSocket是一个高度可扩展且易于使用的.NET Socket服务端开发框架,它简化了基于Socket的网络应用开发过程。SuperSocket提供了丰富的API和强大的功能,使得开发者可以...
SocketTool是一款功能强大的TCP/UDP Socket调试工具,版本为V2.2,它为开发者提供了便利的网络通信测试环境。Socket编程是计算机网络编程的基础,主要用于实现不同设备间的通信。这款工具能够帮助开发者模拟Socket...
sokit socket调试 tcp udp for mac
以下是关于HPSocket、Socket通讯以及其C#和C++实现的关键知识点: 1. **HPSocket库**: HPSocket是一款强大的.NET和C++ Socket组件,它为开发者提供了丰富的网络编程接口,包括TCP、UDP、HTTP等多种协议的支持。HP...
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 创建代理IPEndPoint IPEndPoint proxyEndpoint = new IPEndPoint(IPAddress.Parse(proxyHost), proxyPort);...
1. **集成Socket服务**:在Spring中集成Socket服务,我们通常会使用`java.net.ServerSocket`类来创建服务器端的Socket,并通过`java.net.Socket`处理客户端连接。为了将Socket服务与Spring框架结合,我们可以创建一...
Socket.IO和Socket.IO-Client是两个非常重要的库,主要用于实现实时双向通信,尤其是在Web开发领域。它们使得JavaScript客户端(浏览器)与Node.js服务器之间能够建立WebSocket风格的连接,提供了强大的实时通信解决...