Ponder Socket in Java 对Java中使用Socket时异常情况的思考
(2006-08-22 22:05:10)
分类:
技术
在Java中建立网络非常简单,但也要涉及到Socket,Stream,Thread。对于通常使用来说,通用的例程就足够了,也非常简单,但如果涉及到设计及实现一个协议就需要考虑到各种异常情况了,而一旦涉及到异常情况就会带来很多麻烦。一个健壮的模块反向需求的考虑和实现是需要比正常需求难上好几倍。下面列举一下Socket中需要考虑的一些异常情况,希望能对大家有帮助。
1、创建一个侦听端口时如果此端口不可用会导致java.net.BindException:
Address already in use: JVM_Bind异常。
2、与一个不可达的地址连接会导致异常,与一个不可解释的名字连接会导致异常,与一个未启动的端口建立连接会导致java.net.ConnectException:
Connection refused: connect异常。
3、关闭Socket等同于关闭输入输出流,任意关闭输出流或输入流都会导致整个Socket被关闭。Socket关闭后在输出流中输入流结束符,同时会禁止另一端输出操作。如果未关闭Socket而退出程序则会导致连接重置。Socket关闭后在本端继续操作(包括获取输入输出流,读取,写入)将导致java.net.SocketException:
Socket
closed异常。Socket关闭后在另一端读取会导致java.io.EOFException异常,输出时不会导致异常,但输出后再读取会导致java.net.SocketException:
Software caused connection abort: recv
failed异常。连接重置后另一端读取会导致java.net.SocketException:
Connection reset异常,输出会导致java.net.SocketException:
Connection reset by peer: socket write error异常。
4、使用半连接可以只关闭输出流或只关闭输入流。关闭输出之后,即不能再写,再写会抛java.net.SocketException:
Cannot send after socket shutdown: socket write
error异常,但不影响另一端读;关闭输入流之后,不能再读,再读会抛java.net.SocketException:
Socket input is
shutdown,另一端也不能再写,写的话会抛java.net.SocketException:
Software caused connection abort: socket write error异常。
5、阻塞时调用中断线程不会抛出中断异常。要在阻塞时中断线程要使用Channel。但只能通过SocketChannel来建立连接,对服务器端不可用。并且中断线程后就关闭了Channel。可以考虑使用带超时的socket来间接实现中断。
6、Socket超时setSoTimeout()是针对每一次操作而言,无操作时的累积时间不认为超时,超时发生时会导致java.net.SocketTimeoutException:
Read timed
out异常,但对socket本身无影响,可以继续使用。建立时超时可通过创建一个无连接的Socket并在之后连接另一端时指定超时。
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。