Java网络编程从入门到精通(16):客户端套接字(Socket)的超时[Java编程]
本文“Java网络编程从入门到精通(16):客户端套接字(Socket)的超时[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
客户端套接字的超时(timeout)就是指在客户端通过Socket和服务器举行通讯的历程中,由于网络耽误,网络阻塞等缘由,造成服务器并未及时呼应客户端的一种现象.在一段时间后,客户端由于未收到服务端的呼应而抛出一个超时错误; 此中客户端所等候的时间就是超不时间.
由于生产超时错误的一端都是被动端;也就是说,这一端是在接纳数据,而不是发送数据.关于客户端Socket来说,只有两个地方是在接纳数据;一个是在衔接服务器时;另一个是在衔接服务器成功后,接纳服务器发过来的数据时.因此,客户端超时也分为两种范例:衔接超时和读取数据超时.
1、衔接超时
这种超时在前面的例子中已经利用过.在Socket类中只有通过connect办法的第二个参数才能指定衔接超时的时间.由于利用connect办法衔接服务器必必要指定IP和端口;因此,无效的IP或端口将会引发衔接超时错误.
2、读取数据超时
在衔接服务器成功后,Socket所做的最重要的两件事就是“接纳数据”和“发送数据”;而在接纳数据时大概因为网络耽误、网络阻塞等缘由,客户端一向处于等候状况;而客户端在等候一段时间后,假如服务器还没有发送数据到客户端,那么客户端Socket将会抛出一个超时错误.
我们可以通过Socket类的setSoTimeout办法来设置读取数据超时的时间;时间的单位是毫秒.这个办法必须在读取数据之前调用才会见效.假如将超不时间设为0,则不利用超不时间;也就是说,客户端什么时刻和服务器断开,将完好取决于服务端程序的超时设置.以下面的语句将读取数据超不时间设为5秒.
Socket socket = new Socket();
socket.setSoTimeout(5000);
socket.connect(… …);
socket.getInputStream().read();
要注意的是不要将设置衔接超时和读取数据超时设置得太小,假如值太小,如100,大概会造成服务器的数据还没来得及发过来,客户端就抛出超时错误的现象.下面的代码给出了一个用于测试衔接超时和读取数据超时的例子.
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 < 4)
{
System.out.println("参数错误!");
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() && socket.isConnected())
System.out.println("读取数据超时!");
else
System.out.println("衔接超时");
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
finally
{
time2 = System.currentTimeMillis();
System.out.println(time2 - time1);
}
}
}
以上是“Java网络编程从入门到精通(16):客户端套接字(Socket)的超时[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |