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
JAVA Socket 编程---Socket 和 ServerSocket的更多相关文章
- java网络编程socket\server\TCP笔记(转)
java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04| 分类: Socket | 标签:java |举报|字号 订阅 1 TCP的开销 a ...
- java网络编程socket解析
转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在 ...
- java网络编程Socket通信详解
Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...
- java网络编程——socket实现简单的CS会话
还记得当年学计网课时用python实现一个简单的CS会话功能,这也是学习socket网络编程的第一步,现改用java重新实现,以此记录. 客户端 import java.io.*; import ja ...
- Java网络编程——Socket
网络是连接不同计算机的媒介,不同的计算机依靠网络来互相通信,即传递数据. Java中与网络编程相关的部分主要是Socket(套接字),它作为一种抽象的结构,实现了与通信相关的各类方法,构成一套完整的通 ...
- day05 Java网络编程socket 与多线程
java网络编程 java.net.Socket Socket(套接字)封装了TCP协议的通讯细节,是的我们使用它可以与服务端建立网络链接,并通过 它获取两个流(一个输入一个输出),然后使用这两个流的 ...
- JAVA网络编程Socket常见问题 【长连接专题】
一. 网络程序运行过程中的常见异常及处理 第1个异常是 java.net.BindException:Address already in use: JVM_Bind. 该异常发生在服务器端进行new ...
- Java网络编程Socket通信
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议 UDP (User Datagram Proto ...
- java 网络编程Socket
TCP: 通过TCP协议传输,得到的是一个顺序的无差错的数据流. 发送方和接收方的成对的两个socket之间必须建立连接, 以便在TCP协议的基础上进行通信,当一个socket(通常都是server ...
随机推荐
- [转帖]中国公有云2018H1市场占有率
IDC:阿里云中国第一 市场份额为2到9名总和 https://news.cnblogs.com/n/617838/ 1 月 21 日,市场研究机构 IDC 日前公布 2018 年上半年中国公有云 ...
- [转帖]Nginx安装及配置详解 From https://www.cnblogs.com/zhouxinfei/p/7862285.html
Nginx安装及配置详解 nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP ...
- Idea解决打开大文件消耗CPU问题
dea打开大文件的时候,会导致cpu利用率变得特别高,我这边八核i7的配置下,cpu依然飙到了600%~700%,这个时候就需要修改idea的配置(下面以Ubuntu为例). 1.进入到idea安装目 ...
- 读取excel思路
1.输入地址 2.输入指定的sheet 通过sheet()[]方式指定 3.输入执行的单元位置 通过 .cell_value(x,y)方式指定 示例 data = xlrd.open_workboo ...
- python+django+uwsgi 搭建环境
第一步: 搭建python环境 最好使用 pyenv可以很好的管理多版本下的python环境 第二步:搭建django环境 使用 pip install django==1.12.1 来安 ...
- BZOJ1069 SCOI2007最大土地面积(凸包+旋转卡壳)
求出凸包,显然四个点在凸包上.考虑枚举某点,再移动另一点作为对角线,容易发现剩下两点的最优位置是单调的.过程类似旋转卡壳. #include<iostream> #include<c ...
- QAU 17校赛 J题 剪丝带(完全背包变形)
题意: 剪一段丝带,对于剪完后的每一段丝带长度必须是a,b,c 输入丝带的长度 n 和 a b c 输出一个整数,代表最多能剪成多少段 样例输入 5 5 3 2 7 5 5 2 样例输出 2 ...
- Spring Security和 JWT两大利器来打造一个简易的权限系统。
写在前面 关于 Spring Security Web系统的认证和权限模块也算是一个系统的基础设施了,几乎任何的互联网服务都会涉及到这方面的要求.在Java EE领域,成熟的安全框架解决方案一般有 A ...
- 2.9 C++使用默认参数的构造函数
总结: 默认参数的构造函数,其默认参数必须置于参数列表的结尾. 设计类的构造函数的时候最好不要同时是用构造函数的重载和带参数的构造函数. 我们可以想象一个这样的场景:某一天书店整理库存,发现了一些非常 ...
- 沉迷Link-Cut tree无法自拔之:[BZOJ3514] Codechef MARCH14 GERALD07 加强版
来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 又是一道骚题...... 先讲一个结论: 假设我们用 \(LCT\) 来做这道题, 在插入边 \(i\) ...