`
hougechuanqi
  • 浏览: 73141 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于Socket的那些事

 
阅读更多

  今天有时间重新温习了一下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_

    【标题】"HPSocket.Net-develop_hpsocket.net_HPSocket_.net_socket_tcp_" 提供的知识点主要集中在使用C#编程语言实现基于TCP协议的Socket通信上,并且涉及到一个名为"HPSocket.Net"的库。HPSocket.Net是针对.NET...

    c#超级Socket库SuperSocket,SOCKET多线程编程

    **SuperSocket库详解** SuperSocket是一款高性能、轻量级的C# Socket服务器开发框架,它为开发者提供了构建基于TCP/IP协议的应用程序的便利工具。在.NET平台上,SuperSocket以其易于扩展和高度定制化的特性,成为了...

    关于socket资料,新手必学

    6. **《经典SQL语句大全》**:虽然不是直接关于Socket编程,但SQL知识对于处理数据库操作,特别是在构建网络应用时存储和检索数据是必不可少的。 7. **《vb_net socket接收数据》**:专门讨论了VB.NET中如何接收...

    socket详解 socket详解 socket详解 socket详解

    Socket 编程详解 在网络编程中,Socket 是一个基本概念, plays a crucial role in building network applications. 在 C# 中,Socket 编程是通过使用 System.Net.Sockets 命名空间中的类和方法来实现的。下面,...

    socket池,socket

    Socket池和Socket连接池是网络编程中的重要概念,主要用于提高应用程序的性能和效率。在处理大量并发网络连接时,传统的单个Socket连接方式可能会导致系统资源的过度消耗,因此引入了Socket池技术。 Socket,全称是...

    关于socket的封装使用

    Socket是网络编程中的一个重要概念,它是基于TCP/IP通信协议实现的一种通信方式,允许两台计算机通过互联网进行双向通信。在Android开发中,我们经常会用到Socket进行客户端与服务器端的数据交换。下面将详细介绍...

    SuperSocket Socket C# 通讯详细介绍

    **SuperSocket Socket C# 通讯详解** 在C#编程领域,网络通信是一个不可或缺的部分,而SuperSocket则是一个强大且易用的.NET Socket服务器框架。它为开发者提供了构建自定义网络应用服务的基础,使得处理TCP连接变...

    socketDemo

    Socket编程在IT行业中是网络通信的基础,特别是在C#开发中,`System.Net.Sockets`命名空间提供了Socket类,用于实现客户端和服务器之间的通信。本示例"socketDemo"旨在展示如何创建一个基本的Socket服务器...

    9772.zip_mql_mql4 socket_socket

    "9772.zip_mql_mql4 socket_socket"的标题暗示了这是一个关于MQL4中使用socket套接字进行网络通信的资源包。Socket编程是计算机通信领域中的一个基础概念,它允许不同设备间的进程通过网络进行数据交换。在MQL4中,...

    SocketTool(很好用的socket测试工具)

    SocketTool(很好用的socket测试工具)

    Socket工具SocketTool

    "文档"很可能包含了更多关于SocketTool的使用方法、示例代码和开发细节。 总的来说,SocketTool是一款全面且强大的网络通信工具,它的多功能性和易扩展性使其成为IT专业人士进行网络调试、开发和管理的理想选择。...

    socket test 测试工具

    在提供的文件名称列表"SocketTest3"中,我们可以推测这可能是一个Socket测试工具的第三个版本,或者包含一系列关于Socket测试的案例或代码示例。使用此类工具,开发者可以更好地理解和优化他们的Socket应用程序,...

    SuperSocket-master_Socket基于TCP、UDP

    **SuperSocket:强大的.NET Socket框架** SuperSocket是一个高度可扩展且易于使用的.NET Socket服务端开发框架,它简化了基于Socket的网络应用开发过程。SuperSocket提供了丰富的API和强大的功能,使得开发者可以...

    SocketTool (TCP/UDP Socket 调试工具 V2.2)

    SocketTool是一款功能强大的TCP/UDP Socket调试工具,版本为V2.2,它为开发者提供了便利的网络通信测试环境。Socket编程是计算机网络编程的基础,主要用于实现不同设备间的通信。这款工具能够帮助开发者模拟Socket...

    socket调试工具 socketTool

    sokit socket调试 tcp udp for mac

    基于HPSocket实现 socket 通讯 - 修正版 ( C# demo 、 C++ dll )

    以下是关于HPSocket、Socket通讯以及其C#和C++实现的关键知识点: 1. **HPSocket库**: HPSocket是一款强大的.NET和C++ Socket组件,它为开发者提供了丰富的网络编程接口,包括TCP、UDP、HTTP等多种协议的支持。HP...

    c# socket设置代理

    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 创建代理IPEndPoint IPEndPoint proxyEndpoint = new IPEndPoint(IPAddress.Parse(proxyHost), proxyPort);...

    spring集成socket服务

    1. **集成Socket服务**:在Spring中集成Socket服务,我们通常会使用`java.net.ServerSocket`类来创建服务器端的Socket,并通过`java.net.Socket`处理客户端连接。为了将Socket服务与Spring框架结合,我们可以创建一...

    socket.io,socket.io-client下载

    Socket.IO和Socket.IO-Client是两个非常重要的库,主要用于实现实时双向通信,尤其是在Web开发领域。它们使得JavaScript客户端(浏览器)与Node.js服务器之间能够建立WebSocket风格的连接,提供了强大的实时通信解决...

Global site tag (gtag.js) - Google Analytics