socket网络编程的常见问题小结与注意事项

下水道井盖
投影拼接socket⽹络编程的常见问题⼩结与注意事项
⼀、常见问题
1、.java.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。
该异常在客户端和服务器端均有可能发⽣,引起该异常的原因有两个,第⼀个就是如果⼀端的Socket被关闭(或主动关闭或者因为异常退出⽽引起的关闭),另⼀端仍发送数据,发送的第⼀个数据包引发该异常(Connect reset by peer)。另⼀个是⼀端退出,但退出时并未关闭该连接,另⼀端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是由连接断开后的读和写操作引起的。
2、java.BindException:Address already in use: JVM_Bind。
该异常发⽣在服务器端进⾏new ServerSocket(port)(port是⼀个0,65536的整型值)操作时。异常的原因是以为与port⼀样的⼀个端⼝已经被启动,并进⾏监听。此时⽤netstat -an命令,可以看到⼀个Listending状态的端⼝。只需要⼀个没有被占⽤的端⼝就能解决该问题了。
3、java.SocketException: Socket is closed。
该异常在客户端和服务器均可能发⽣。异常的原因是本端主动关闭了连接后(调⽤了Socket的close⽅法)再对⽹络连接进⾏读写操作。
地理位置服务4、java.ConnectException: Connection refused: connect。
该异常发⽣在客户端进⾏ new Socket(ip, port)操作时,该异常发⽣的原因是或者具有ip地址的机器不能到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但不到指定的端⼝进⾏监听。出现该问题,⾸先检查客户端的ip和port是否写错,如果正确则从客户端ping⼀下服务器看是否能ping通,如果能ping通(服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端⼝的程序是否启动,这个肯定能解决这个问题。
5、java.SocketException: Connection reset 或者Connect reset by peer:Socket write error。
该异常在客户端和服务器端均有可能发⽣,引起该异常的原因有两个,第⼀个就是假如⼀端的 Socket 被关闭(或主动关闭或者因为异常退出⽽引起的关闭), 另⼀端仍发送数据,发送的第⼀个数据包引发该异常(Connect reset by peer)。另⼀个是⼀端退出,但退出时并未关闭该连接,另 ⼀ 端 假 如 在 从 连 接 中 读 数 据 则 抛 出 该 异 常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。
对于服务器,⼀般的原因可以认为:
a) 服务器的并发连接数超过了其承载量,服务器会将其中⼀些连接主动 Down 掉。
b) 在数据传输的过程中,浏览器或者接收客户端关闭了,⽽服务端还在向客户端发送数据。
6、java.SocketException: Broken pipe。
该异常在客户端和服务器均有可能发⽣。在第4个异常的第⼀种情况中(也就是抛出 SocketExcepton:Connect reset by peer:Socket write error后),如果再继续写数据则抛出该异常。前两个异常的解决⽅法是⾸先确保程序退出前关闭所有的⽹络连接,其次是要检测对⽅的关闭连接操作,发现对⽅关闭连接后⾃⼰也要关闭该连接。
⼆、注意事项
电脑防尘罩1、长短连接区分
所谓的长连接是指⼀经建⽴就永久保持。短连接的情况是,准备数据—>建⽴连接—>发送数据—>关闭连接。很多的程序员写了多年的⽹络程序,居然不知道什么是长连接,什么是短连接。
保护架
2、长连接维护
维护包括两个⽅⾯,⾸先是检测对⽅的主动断连(即调⽤ Socket的close⽅法),其次是检测对⽅的宕机、异常退出及⽹络不通。这是⼀个健壮的通信程序必须具备的。检测对⽅的主动断连很简单,主
要⼀⽅主动断连,另⼀⽅如果在进⾏读操作,则此时的返回值只-1,⼀旦检测到对⽅断连,则应该主动关闭本端的连接(调⽤Socket的close⽅法)。⽽检测对⽅的宕机、异常退出及⽹络不通,常⽤⽅法是⽤“⼼跳”,也就是双⽅周期性的发送数据给对⽅,同时也从对⽅接收“⼼跳”,如果连续⼏个周期都没有收到对⽅⼼跳,则可以判断对⽅宕机、异常退出或者⽹络不通,此时也需要主动关闭本端连接,如果是客户端可在延迟⼀定时间后重新发起连接。虽然Socket有⼀个keep alive选项来维护连接,如果⽤该选项,⼀般需要两个⼩时才能发现对⽅的宕机、异常退出及⽹络不通。
3、处理效率。
染料助剂不管是客户端还是服务器,如果是长连接⼀个程序⾄少需要两个线程,⼀个⽤于接收数据,⼀个⽤于发送⼼跳,写数据不需要专门的线程,当然另外还需要⼀类线程(俗称Worker线程)⽤于进⾏消息的处理,也就是说接收线程仅仅负责接收数据,然后再分发给Worker进⾏数据的处理。如果是短连接,则不需要发送⼼跳的线程,如果是服务器还需要⼀个专门的线程负责进⾏连接请求的监听。这些是⼀个通信程序的整体要求,具体到你的程序中,就看你如何对程序进⾏优化。

本文发布于:2024-09-22 13:32:54,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/129863.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:连接   关闭   客户端   需要   线程   程序   服务器   退出
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议