1.常见异常
1.java.net.SocketTimeoutException . 这个异 常比较常见,socket 超时。一般有 2 个地方会抛出这个,一个是 connect 的 时 候 , 这 个 超 时 参 数 由connect(SocketAddress endpoint,int timeout) 中的后者来决定,还有就是 setSoTimeout(int timeout),这个是设定读取的超时时间。它们设置成 0 均表示无限大。
2.java.net.BindException:Address already in use: JVM_Bind 。 该异常发生在服务 端进行new ServerSocket(port) 或者 socket.bind(SocketAddress bindpoint)操作时。
原因:与 port 一样的一个端口已经被启动,并进行监听。此时用 netstat –an 命令,可以看到一个 Listending 状态的端口。只需要找一个没有被占用的端口就能解决这个问题。
3.java.net.ConnectException: Connection refused: connect。该异常发生在客户端进行new Socket(ip, port)或者 socket.connect(address,timeout)操作时,
原 因:指定 ip 地址的机器不能找到(也就是说从当前机器不存在到指定 ip 路由),或者是该 ip 存在,但找不到指定的端口进行监听。应该首先检查客户端的 ip 和 port是否写错了,假如正确则从客户端 ping 一下服务器看是否能 ping 通,假如能 ping 通(服务服务器端把 ping 禁掉则需要另外的办法),则 看在服务器端的监听指定端口的程序是否启动。
4.java.net.SocketException: Socket is closed ,该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了 Socket 的 close 方法)再对网络连接进行读写操作。
5.java.net.SocketException: Connection reset 或者Connect reset by peer:Socket write error。 该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是假如一端的 Socket 被关闭(或主动关闭或者因为异常退出而引起的关闭), 另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端假如在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。
对于服务器,一般的原因可以认为:
a) 服务器的并发连接数超过了其承载量,服务器会将其中一些连接主动 Down 掉.
b) 在数据传输的过程中,浏览器或者接收客户端关闭了,而服务端还在向客户端发送数据。
6.java.net.SocketException: Broken pipe。 该异常在客户端和服务器均有可能发生。在抛出SocketExcepton:Connect reset by peer:Socket write error 后,假如再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方 关闭连接后自己也要关闭该连接。
对于 4 和 5 这两种情况的异常,需要特别注意连接的维护。在短连接情况下还好,如果是长连接情况,对于连接状态的维护不当,则非常容易出现异常。基本上对长连接需要做的就是:
a) 检测对方的主动断连(对方调用了 Socket 的 close 方法)。因为对方主动断连,另一方如果在进行读操作,则此时的返回值是-1。所以一旦检测到对方断连,则主动关闭己方的连接(调用 Socket 的 close 方法)。
b) 检测对方的宕机、异常退出及网络不通,一般做法都是心跳检测。双方周期性的发送数据给对方,同时也从对方接收“心跳数据”,如果连续几个周期都没有收到 对方心跳,则可以判断对方或者宕机或者异常退出或者网络不通,此时也需要主动关闭己方连接;如果是客户端可在延迟一定时间后重新发起连接。虽然 Socket 有一个keep alive 选项来维护连接,如果用该选项,一般需要两个小时才能发现对方的宕机、异常退出及网络不通。
7.java.net.SocketException: Too many open files
原因: 操作系统的中打开文件的最大句柄数受限所致,常常发生在很多个并发用户访问服务器的时候。因为为了执行每个用户的应用服务器都要加载很多文件(new 一个socket 就需要一个文件句柄),这就会导致打开文件的句柄的缺乏。
解决方式:
a) 尽量把类打成 jar 包,因为一个 jar 包只消耗一个文件句柄,如果不打包,一个类就消耗一个文件句柄。
b) java 的 GC 不能关闭网络连接打开的文件句柄,如果没有执行 close()则文件句柄将一直存在,而不能被关闭。
也可以考虑设置 socket 的最大打开 数来控制这个问题。对操作系统做相关的设置,增加最大文件句柄数量。
ulimit -a 可以查看系统目前资源限制,ulimit -n 10240 则可以修改,这个修改只对当前窗口有效。
2.常见参数设置

backlog:用于ServerSocket,配置ServerSocket的最大客户端等待队列。等待队列的意思,先看下面代码

public class Main {public static void main(String[] args) throws Exception {int port = 8999;int backlog = 2; ServerSocket serverSocket = new ServerSocket(port, backlog); Socket clientSock = serverSocket.accept(); System.out.println("revcive from " + clientSock.getPort());while (true) {byte buf[] = new byte[1024];int len = clientSock.getInputStream().read(buf); System.out.println(new String(buf, 0, len)); } }}

这段测试代码在第一次处理一个客户端时,就不会处理第二个客户端,所以除了第一个客户端,其他客户端就是等待队列了。所以这个服务器最多可以同时连接3个客户端,其中2个等待队列。大家可以telnet localhost 8999测试下。这个参数设置为-1表示无限制,默认是50个最大等待队列,如果设置无限制,那么你要小心了,如果你服务器无法处理那么多连接,那么当很多客户端连到你的服务器时,每一个TCP连接都会占用服务器的内存,最后会让服务器崩溃的。另外,就算你设置了backlog为10,如果你的代码中是一直Socket clientSock = serverSocket.accept(),假设我们的机器最多可以同时处理100个请求,总共有100个线程在运行,然后你把在100个线程的线程池处理clientSock,不能处理的clientSock就排队,最后clientSock越来越多,也意味着TCP连接越来越多,也意味着我们的服务器的内存使用越来越高(客户端连接进程,肯定会发送数据过来,数据会保存到服务器端的TCP接收缓存区),最后服务器就宕机了。所以如果你不能处理那么多请求,请不要循环无限制地调用serverSocket.accept(),否则backlog也无法生效。如果真的请求过多,只会让你的服务器宕机(相信很多人都是这么写,要注意点)

TcpNoDelay:禁用纳格算法,将数据立即发送出去。纳格算法是以减少封包传送量来增进TCP/IP网络的效能,当我们调用下面代码,如:

Socket socket = new Socket();  socket.connect(new InetSocketAddress(host, 8000));  InputStream in = socket.getInputStream();  OutputStream out = socket.getOutputStream();  String head = "hello ";  String body = "world\r\n";  out.write(head.getBytes());  out.write(body.getBytes()); 

我们发送了hello,当hello没有收到ack确认(TCP是可靠连接,发送的每一个数据都要收到对方的一个ack确认,否则就要重发)的时候,根据纳格算法,world不会立马发送,会等待,要么等到ack确认(最多等100ms对方会发过来的),要么等到TCP缓冲区内容>=MSS,很明显这里没有机会,我们写了world后再也没有写数据了,所以只能等到hello的ack我们才会发送world,除非我们禁用纳格算法,数据就会立即发送了。

SoLinger:当我们调用socket.close()返回时,socket已经write的数据未必已经发送到对方了,例如

Socket socket = new Socket();  socket.connect(new InetSocketAddress(host, 8000));  InputStream in = socket.getInputStream();  OutputStream out = socket.getOutputStream();  String head = "hello ";  String body = "world\r\n";  out.write(head.getBytes());  out.write(body.getBytes()); socket.close();

这里调用了socket.close()返回时,hello和world未必已经成功发送到对方了,如果我们设置了linger而不小于0,如:

bool on = true;int linger = 100;....socket.setSoLinger(boolean on, int linger)......socket.close();

那么close会等到发送的数据已经确认了才返回。但是如果对方宕机,超时,那么会根据linger设定的时间返回。

UrgentData和OOBInline

TCP的紧急指针,一般都不建议使用,而且不同的TCP/IP实现,也不同,一般说如果你有紧急数据宁愿再建立一个新的TCP/IP连接发送数据,让对方紧急处理。

所以这两个参数,你们可以忽略吧,想知道更多的,自己查下资料。

SoTimeout

设置socket调用InputStream读数据的超时时间,以毫秒为单位,如果超过这个时候,会抛出java.net.SocketTimeoutException。

KeepAlive

keepalive不是说TCP的长连接,当我们作为服务端,一个客户端连接上来,如果设置了keeplive为true,当对方没有发送任何数据过来,超过一个时间(看系统内核参数配置),那么我们这边会发送一个ack探测包发到对方,探测双方的TCP/IP连接是否有效(对方可能断点,断网),在Linux好像这个时间是75秒。如果不设置,那么客户端宕机时,服务器永远也不知道客户端宕机了,仍然保存这个失效的连接。

SendBufferSize和ReceiveBufferSize

TCP发送缓存区和接收缓存区,默认是8192,一般情况下足够了,而且就算你增加了发送缓存区,对方没有增加它对应的接收缓冲,那么在TCP三握手时,最后确定的最大发送窗口还是双方最小的那个缓冲区,就算你无视,发了更多的数据,那么多出来的数据也会被丢弃。除非双方都协商好。

Socket中的异常和参数设置相关推荐

  1. python统计字符串中数字个数 socket_Python中socket中的listen()里参数(数字)到底代表什么?...

    在调用socket的时候,我们会使用到listen()函数,里面有个参数叫backlog, 例如:socket.listen(5). 那么这个数字5到底代表什么意思呢? 解答 下面使用具体的代码片段来 ...

  2. 中boxplot函数的参数设置_如何在Python中生成图形和图表

    在本章中,我们将学习如何在Python中生成图形和图表,同时将使用函数和面向对象的方法来可视化数据. Python中常用的一些可视化数据包括以下几种. Matplotlib. Seaborn. ggp ...

  3. OA系统十七:请假申请三:【请假申请】这个内嵌界面中【提交请假表单数据】的Service层;(PS:在EmployeeDao中初次遇到@Param()参数设置)

    本篇博客的主要内容是:  本篇博客的需要注意的点有: (1)根据业务需求,规划好整体的代码结构和编码逻辑: (2)一种目前认可的编程小细节:(PS:随着以后经验增多,可能会抛弃这种想法,或者有其他理解 ...

  4. mybatis中mapper接口的参数设置几种方法

    方法一:忽略parameterType,加@param("xxx")注解 在mapper接口中加上@param("xxx")注解,则在配置文件中直接用即可 Li ...

  5. matlab的newff语句,matlab 中“newff” 函数的参数设置

    matlab 中"newff" 函数的使用方法技巧|和各参数的意义 先来一个简单的源程序让大家练习一下: % Here input P and targets T define a ...

  6. VSCode中配置git(参数设置) - 教程篇【不推荐阅读】

    VSCode中git的配置 [不推荐阅读] 原因:可以通过git clone规避配置不成功问题. 具体查看相关文章:VSCode + git 代码托管[当前没有源代码管理提供程序注册](没有'+'加法 ...

  7. matlab中boxplot函数的参数设置_matlab 命令 boxplot

    Matlab中有关boxplot(X)命令的解释:boxplot(X) produces a box and whisker plot for each column of the matrix X. ...

  8. matlab中boxplot函数的参数设置_用matlab画boxplot中的一些应用说明

    由于matlab具有强大的计算功能,用其统计数据功能优点显而易见,这里分享使用matlab中的boxplot的一些技巧,供大家参考. Matlab boxplot命令 格式如下boxplot(X):产 ...

  9. matlab中boxplot函数的参数设置_matlab中boxplot字体大小设置

    网上找到的: set(findobj(gca,'Type','text'),'FontSize',18) boxplot() uses the default axes labeling for th ...

最新文章

  1. windows 2008 引导故障实录
  2. ESXi 6.5 进入维护模式死机在68%的进度的bug
  3. 6、Cocos2dx 3.0游戏开发的基本概念找个小三场比赛
  4. mysql5.6.4以下不支持多个字段类型为timestamp
  5. 微课堂迎圣诞送福利 | 姬十三@你:我想和你相聚社区共度圣诞良宵,约么?
  6. 图片日志:深拷贝和浅拷贝的区别/序列化及反序列化
  7. boost::pointer_traits用法实例
  8. sed以及awk的替换命令
  9. lucene索引创建
  10. 本地未安装Oracle数据库,如何连接远程Oracle数据库
  11. [置顶]       Web开发百宝箱——提升网站档次的时尚 jQuery 图片滚动插件
  12. Linux网络子系统中旧的报文接收接口netif_rx
  13. 淘宝 卖家信用等级的图示
  14. 企业微信开发实战(三、OA审批之回调通知、获取审批单号、审批详情)
  15. 【2019年04月09日】A股净资产收益率ROE最高排名
  16. 7年老Android一次操蛋的面试经历
  17. 日语中di,ti,du,这些如何用片假名打出来
  18. 如何下载网页中使用的JS及CSS文件
  19. 亿级万物互联新时代的物联网消息中间件EMQX调研
  20. 电压空间矢量的白话准确表述

热门文章

  1. mysql etc_mysql etc下my.conf配置详情
  2. mysql join union_MySQL中union和join语句使用区别的辨析教程
  3. 视觉在无人驾驶中的应用及分类_机器视觉可以应用于水果自动分类拣选,你见过吗?...
  4. linux里运行windows,在Linux上运行Windows应用程序
  5. android如何查看方法属于哪个类,Android Studio查看类中所有方法和属性
  6. 【html】如何解决标签设置成超链接后字体格式及颜色变化的问题
  7. git 合并两个分支的某个文件
  8. 小程序实现瀑布流,获取图片高度分成两组数据的函数封装代码
  9. socket第三方库 AsyncSocket(源码注释解读.转)
  10. SQLServer之ISO游标使用