当前位置: 首页 > news >正文

JAVA Socket 编程---Socket 和 ServerSocket

一,Socket

Socket的选项

1) TCP_NODELAY:默认值为false。表示采用Negale算法。当设置为true时,表示关闭Socket缓冲,立即发送数据。

Socket默认发送数据是采用Negale算法。Negale算法是指发送方发送的数据不会立即发出,而是先放在缓冲区内,等缓冲区满了再发出。发送完一批数据后,会等待对方对这批数据的回应,然后再发送下一批数据。该算法的目的是通过减少传输次数来提高通信的效率。

 

2) SO_RESUSEADDR:默认值为 false。当socket连接关闭时,底层的端口并不会立即释放。若要立即释放,将SO_RESUSEADDR设置为true

在Socket通信中,当接收方调用Socket的close()方法关闭Socket时,若网络上还有发送到这个Socket的数据,那么底层的Socket不会立即释放本地端口,而是会等待一段时间以确保收到了网络上发送过来的数据,然后再释放端口。Socket收到这些延迟的数据并不做任何处理。

底层socket之所以还继续接收延迟的数据并且不会立即释放端口,是因为:确保这些数据不会被其他碰巧绑定到同样端口的新进程接收到。当将SO_RESUSEADDR设置为true后,同一主机上的其他进程可以立即重用该端口。

 

3) SO_TIMEOUT:

当通过Socket的输入流读取数据时,如果还没有数据,就会等待。从socket的输入流读取数据的示例代码如下:

byte[] buff = new byte[1024];
InputStream in = socket.getInputStream();
in.read(buff);

若输入流中没有数据,in.read(buff)就会等待发送方发送数据,直至以下条件满足时才结束等待。

a) 输入流中有 1024 个字节的数据,read()方法把这些字节读入到buff中,并返回读取的字节数。

b) 当快接近输入流的末尾时,距离末尾还有小于 1024 个字节的数据,read方法会把这些数据读入到buff中,并返回读取的字节数。

c) 已经读取了输入流的末尾,返回 -1

d) 连接已经断开,read会结束等待并且抛出IOException

f) 若通过Socket的 setSoTimeout()方法设置了等待超时时间,那么超过超时时间后结束等待并且抛出SocketTimeoutException异常

以上五种情况可以用来判断while形式的读取何时终止,代码如下:

int len = -1;
while((len = in.read(buff)) != -1){
    //do some process
}

 

4)SO_LINGER:该选项用来控制Socket关闭时的行为。

默认情况下,执行Socket的 close()方法时,该方法会立即返回,但是底层的Socket实际上并不立即关闭,它会延迟一段时间,直至发送完所有的剩余数据后才会真正关闭Socket,断开连接。

若将该选项设置为true,则执行Socket的close()方法会立即返回,且底层的Socket也会立即关闭,所有未发送完的剩余数据丢弃。

 

 

二,ServerSocket

ServerSocket有一个构造方法: ServerSocket(int port, int backlog)throws IOException

参数backlog指定客户连接请求队列的长度。那什么是客户连接请求队列呢?

当ServerSocket启动后(ServerSocket serverSocket = new ServerSocket("localhost", 8080);)它就会一直等待客户端的连接到来。

当客户端通过 Socket socket = new Socket("localhost", 8080),创建一个socket连接请求后,若ServerSocket的连接请求队列未满,则 new Socket("localhost", 8080)立即返回一个Socket对象,并把该请求放到客户连接请求队列中。管理客户连接请求的任务是由操作系统完成,操作系统把这些连接请求放在一个队列中。

只有当ServerSocket调用了 accept()方法后,才表示真正建立起来了一条socket连接。服务器通过ServerSocket的accept方法从队列中取出连接请求,建立起连接;同时也使队列腾出空位,队列才能继续加入新的连接请求。若客户端发出的连接请求被服务器拒绝,Socket构造方法抛出ConnectionException异常。

 

ServerSocket选项

SO_TIMEOUT:表示等待客户连接的超时时间。默认值为0,表示永远不会超时。

当服务器执行ServerSocket的accept方法时,若连接请求队列为空,服务器就会一直等待,直至接收到了客户连接才从accept方法返回。若设定了超时时间,那么当服务器等待的时间超过了超时时间后,就会抛出SocketTimeoutException

 

相关文章:

  • redhat+11g+rac 安装数据库软件时只有一个节点可选
  • 软件生命周期之需求分析和设计
  • 线程的正确停止
  • C++类的存储
  • PHP+Swoole网络通信框架
  • spark-submit提交任务到集群
  • 结合Scikit-learn介绍几种常用的特征选择方法
  • js图片处理
  • bconsole中相关命名说明
  • Oracle更改redo log的大小
  • parallels desktop克隆ubuntu虚拟机网卡丢失
  • 泛型vector
  • [转]SQLServer 2008数据库查看死锁、堵塞的SQL语句
  • Solr5安装部署
  • Scrapy 入门:Hello Scrapy
  • Elasticsearch 参考指南(升级前重新索引)
  • go语言学习初探(一)
  • JavaScript中的对象个人分享
  • Java应用性能调优
  • nodejs调试方法
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Spring Boot MyBatis配置多种数据库
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从输入URL到页面加载发生了什么
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 设计模式走一遍---观察者模式
  • 进程与线程(三)——进程/线程间通信
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • $ git push -u origin master 推送到远程库出错
  • (14)Hive调优——合并小文件
  • (C语言)fread与fwrite详解
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计ssm电影分享网站
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET 使用配置文件
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .net连接MySQL的方法
  • /boot 内存空间不够
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [BJDCTF 2020]easy_md5
  • [C语言]——内存函数
  • [HCTF 2018]WarmUp (代码审计)
  • [LLM][FT]大模型Fine-Tuning相关技术0
  • [MySQL--进阶篇]存储引擎的体系结构、简介、特点、选择
  • [NHibernate]一对多关系(关联查询)
  • [NOI 2016]循环之美