没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
JAVA Socket 超时浅析
套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间
一个连接的“终端”。针对一个特定的连接,每台机器上都有一个“套接字”,
可以想象它们之间有一条虚拟的“线缆”。JAVA 有两个基于数据流的套
接字类:ServerSocket,服务器用它“侦听”进入的连接;Socket,客户
端用它初始一次连接。侦听套接字只能接收新的连接请求,不能接收实
际的数据包。
套接字是基于 TCP/IP 实现的,它是用来提供一个访问 TCP 的服务接
口,或者说套接字 socket 是 TCP 的应用编程接口 API,通过它应用层
就可以访问 TCP 提供的服务。
在 JAVA 中,我们用 ServerSocket、Socket 类创建一个套接字连接,
从套接字得到的结果是一个 InputStream 以及 OutputStream 对象,以
便将连接作为一个 IO 流对象对待。通过 IO 流可以从流中读取数据或者
写数据到流中,读写 IO 流会有异常 IOException 产生。
套接字底层是基于 TCP 的,所以 socket 的超时和 TCP 超时是相同的。
下面先讨论套接字读写缓冲区,接着讨论连接建立超时、读写超时以及
JAVA 套接字编程的嵌套异常捕获和一个超时例子程序的抓包示例。
1 socket 读写缓冲区
一旦创建了一个套接字实例,操作系统就会为其分配缓冲区以存放接
收和要发送的数据。
JAVA 可以设置读写缓冲区的大小-setReceiveBufferSize(int size),
setSendBufferSize(int size)。
向输出流写数据并不意味着数据实际上已经被发送,它们只是被复制
到了发送缓冲区队列 SendQ,就是在 Socket 的 OutputStream 上调用
flush()方法,也不能保证数据能够立即发送到网络。真正的数据发送是
由操作系统的TCP协议栈模块从缓冲区中取数据发送到网络来完成的。
当有数据从网络来到时,TCP 协议栈模块接收数据并放入接收缓冲区
队列 RecvQ,输入流 InputStream 通过 read 方法从 RecvQ 中取出数
据。
2 socket 连接建立超时
socket 连接建立是基于 TCP 的连接建立过程。TCP 的连接需要通过
3 次握手报文来完成,开始建立 TCP 连接时需要发送同步 SYN 报文,
然后等待确认报文 SYN+ACK,最后再发送确认报文 ACK。TCP 连接
的关闭通过 4 次挥手来完成,主动关闭 TCP 连接的一方发送 FIN 报文,
等待对方的确认报文;被动关闭的一方也发送 FIN 报文,然等待确认报
文。
剩余12页未读,继续阅读
资源评论
G11176593
- 粉丝: 6874
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功