套接字编程注意问题
2013-06-02 20:40
253 查看
1. 套接字超时
在实际应用的程序中,你可能并不想从套接字读取信息,因为在数据可以被访问之前,读操作将会被阻塞。如果此时主机不可达,那么你的应用将要等待很长时间,并且因为受底层操作系统的限制而最终导致超时。相反,针对不同的应用,你应该确定合理的超时值。然后调用setSoTimeout方法设置这个超时值(单位:毫秒)
如果你已经为套接字设置了超时值,并且之后的读操作和写操作在没有被完成之前就超过了时间限制,那么这些操作就会抛出SocketTimeoutException异常。你可以捕获这些异常,并对超时做出反应。
另外还有一个超时问题是必须解决的:
会一直无限期地阻塞下去,直到建立了到达主机的初始连接为止。
相反,可以通过构建一个无连接的套接字,然后再使用一个超时来进行连接的方法解决该问题。
2.半关闭
当客户端程序发送一个请求给服务器时,服务器必须能够确定该请求何时结束。因此,许多网络协议(例如SMTP)都是面向行的。其他一些协议则包含一个消息头用以指明请求数据的大小。否则,想要表示请求数据的结束将比向文件写入数据更加困难。写一个文件时,只需在数据写入后关闭文件即可。但是如果关闭一个套接字,那么将立刻断开与服务器的连接。
使用半关闭可以解决上述问题。可以通过关闭一个套接字的输出流来表示发送给服务器的请求数据已经结束,但是必须保留输入流打开用以读取服务器返回的相应信息。
当然,该协议只用于一站式的服务,例如HTTP服务,在这种服务中,客户端连接服务器,发送请求,捕获响应信息,然后断开连接。
P.S.
上述所介绍的内容仅适用于TCP网络协议。TCP可以在两台计算机之间建立可靠的连接。JAVA平台另外还支持所谓的UDP协议,该协议用于发送数据包,它所付出的开销要比TCP小的多。UDP有一个重要的特点:数据包都是以随机顺序传递的,它们甚至可能在传输过程中全部都丢失。UDP要求数据包的接收者对它们进行排序,并请求发送者重新发送那些丢失的数据包。UDP比较适合于那些可以忍受数据丢失的应用,例如用于音频流和视频流的传输。
在实际应用的程序中,你可能并不想从套接字读取信息,因为在数据可以被访问之前,读操作将会被阻塞。如果此时主机不可达,那么你的应用将要等待很长时间,并且因为受底层操作系统的限制而最终导致超时。相反,针对不同的应用,你应该确定合理的超时值。然后调用setSoTimeout方法设置这个超时值(单位:毫秒)
如果你已经为套接字设置了超时值,并且之后的读操作和写操作在没有被完成之前就超过了时间限制,那么这些操作就会抛出SocketTimeoutException异常。你可以捕获这些异常,并对超时做出反应。
try { Scanner in = new Scanner(s.getInputStream()); String line = in.nextLine(); }catch(InterruptedIOException exception) { //react to timeout }
另外还有一个超时问题是必须解决的:
Socket(String host,int port)
会一直无限期地阻塞下去,直到建立了到达主机的初始连接为止。
相反,可以通过构建一个无连接的套接字,然后再使用一个超时来进行连接的方法解决该问题。
Socket s = new Socket(); s.connect(new InetSocketAddress(host,port),timeout);
2.半关闭
当客户端程序发送一个请求给服务器时,服务器必须能够确定该请求何时结束。因此,许多网络协议(例如SMTP)都是面向行的。其他一些协议则包含一个消息头用以指明请求数据的大小。否则,想要表示请求数据的结束将比向文件写入数据更加困难。写一个文件时,只需在数据写入后关闭文件即可。但是如果关闭一个套接字,那么将立刻断开与服务器的连接。
使用半关闭可以解决上述问题。可以通过关闭一个套接字的输出流来表示发送给服务器的请求数据已经结束,但是必须保留输入流打开用以读取服务器返回的相应信息。
Socket socket = new Socket(host,port); Scanner in = new Scanner(socket.getInputStream()); PrintWriter writer = new PrintWriter(socket.getOutputStream()); writer.print(...); writer.flush(); socket.shundownOutput();//半关闭 while((in.hasNextLine())!=null) { String line = in.nextLine(); } socket.close();
当然,该协议只用于一站式的服务,例如HTTP服务,在这种服务中,客户端连接服务器,发送请求,捕获响应信息,然后断开连接。
P.S.
上述所介绍的内容仅适用于TCP网络协议。TCP可以在两台计算机之间建立可靠的连接。JAVA平台另外还支持所谓的UDP协议,该协议用于发送数据包,它所付出的开销要比TCP小的多。UDP有一个重要的特点:数据包都是以随机顺序传递的,它们甚至可能在传输过程中全部都丢失。UDP要求数据包的接收者对它们进行排序,并请求发送者重新发送那些丢失的数据包。UDP比较适合于那些可以忍受数据丢失的应用,例如用于音频流和视频流的传输。
相关文章推荐
- 女孩子做IT编程要注意哪些问题?
- 编程中注意的一个问题
- C/C++ 32位机器和64位机器 差异问题总结 跨平台 移植问题 语言编程需要注意的64位和32机器的区别
- 关于OPC自动化接口编程(OPCDAAuto.dll)几点注意问题
- 【Linux网络编程】绑定( bind )端口需要注意的问题
- IE JS编程需注意的内存释放问题
- 提醒编程初学者注意的几个问题2
- 关于socket短链接和长链接在编程时要注意问题
- C#多线程编程之lock语句应注意的问题
- 编程中注意的一个问题
- 在IE下的JS编程需注意的内存释放问题
- ET模式下epoll编程需要注意的问题
- 编程中对于文件路径应该注意的问题
- tsql编程中需要注意的问题
- PHP 编程规范! 尤其注意的几个问题
- [置顶] android高性能编程中需要注意的问题
- 编程时遇到概率加密或概率签名后要注意的问题
- WinInet编程:CHttpFile获取请求头信息注意的几个问题
- android高性能编程中需要注意的问题
- C++学习笔记之编程应当注意的问题