设为首页收藏本站language 语言切换
查看: 1839|回复: 0
收起左侧

Java网络编程:客户端套接字(Socket)超时

[复制链接]
发表于 2010-2-20 14:54:45 | 显示全部楼层 |阅读模式
<p >客户端套接字的超时(timeout)就是指在客户端通过Socket和服务器进行通讯的过程中,由于网络延迟,网络阻塞等原因,造成服务器并未及时响应客户端的一种现象。在一段时间后,客户端由于未收到服务端的响应而抛出一个超时错误; 其中客户端所等待的时间就是超时时间。<p ><p >由于生产超时错误的一端都是被动端;也就是说,这一端是在接收数据,而不是发送数据。对于客户端Socket来说,只有两个地方是在接收数据;一个是在连接服务器时;另一个是在连接服务器成功后,接收服务器发过来的数据时。因此,客户端超时也分为两种类型:连接超时和读取数据超时。<p ><p >一、连接超时<p ><p >这种超时在前面的例子中已经使用过。在Socket类中只有通过connect方法的第二个参数才能指定连接超时的时间。由于使用connect方法连接服务器必须要指定IP和端口;因此,无效的IP或端口将会引发连接超时错误。<p ><p >二、读取数据超时<p ><p >在连接服务器成功后,Socket所做的最重要的两件事就是“接收数据”和“发送数据”;而在接收数据时可能因为网络延迟、网络阻塞等原因,客户端一直处于等待状态;而客户端在等待一段时间后,如果服务器还没有发送数据到客户端,那么客户端Socket将会抛出一个超时错误。<p ><p >我们可以通过Socket类的setSoTimeout方法来设置读取数据超时的时间;时间的单位是毫秒。这个方法必须在读取数据之前调用才会生效。如果将超时时间设为0,则不使用超时时间;也就是说,客户端什么时候和服务器断开,将完全取决于服务端程序的超时设置。如下面的语句将读取数据超时时间设为5秒。<p ><p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>Socket socket = new Socket();socket.setSoTimeout(5000);socket.connect(… …);socket.getInputStream().read();</ccid_code></pre></td></tr></table></ccid_nobr><br><p ><p >要注意的是不要将设置连接超时和读取数据超时设置得太小,如果值太小,如100,可能会造成服务器的数据还没来得及发过来,客户端就抛出超时错误的现象。下面的代码给出了一个用于测试连接超时和读取数据超时的例子。<p ><p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>package mynet;import java.net.*;public class SocketTimeout{    public static void main(String[] args)    {        long time1 = 0, time2 = 0;        Socket socket = new Socket();        try        {            if (args.length &lt; 4)            {                System.out.println(&quot;参数错误!&quot;);                return;            }            time1 = System.currentTimeMillis();            socket.connect(new InetSocketAddress(args[0], Integer                    .parseInt(args[1])), Integer.parseInt(args[2]));            socket.setSoTimeout(Integer.parseInt(args[3]));            time1 = System.currentTimeMillis();            socket.getInputStream().read();        }        catch (SocketTimeoutException e)        {            if (!socket.isClosed() &amp;&amp; socket.isConnected())                System.out.println(&quot;读取数据超时!&quot;);            else                System.out.println(&quot;连接超时&quot;);        }        catch (Exception e)        {            System.out.println(e.getMessage());        }        finally        {            time2 = System.currentTimeMillis();            System.out.println(time2 - time1);        }    }}</ccid_code></pre></td></tr></table></ccid_nobr><br><p ><p >SocketTimeout类的main方法需要4个参数:IP(域名)、端口、连接超时、读取数据超时。下面让我们来用一组数据来测试这个例子。                                 <p align="center"><font color="FF0000" >1</font>2<span class="content01">下一页&gt;&gt;</span></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-6 22:00 , Processed in 0.083004 second(s), 24 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表