首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

socket读不到源的结尾,直到报Read timed out

2013-06-26 
socket读不到流的结尾,直到报Read timed out本帖最后由 sysmaid 于 2013-06-04 15:18:37 编辑初学iso8583,

socket读不到流的结尾,直到报Read timed out
本帖最后由 sysmaid 于 2013-06-04 15:18:37 编辑 初学iso8583,有做这方面的朋友,请多指点下。
代码:


try {
s.setSoTimeout(6000 * 5);//设定超时时间
input = new DataInputStream(new BufferedInputStream(s.getInputStream()));

// 头两个字节表示报文总(报文头+数据内容)长度
byte[] header = new byte[2];//2字节长的报头
int len = 0;
while((len = input.read(header)) != -1){
break;
}
int msgLen = Integer.parseInt(IsoUtil.hexString(header), 16);
System.out.println("megLen=" + msgLen);

//按每次两个字节读取
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int start = 0;
while((len = input.read(header, 0, 2)) != -1){
System.out.println("in while, len=" + len);
start += len;
baos.write(header);
}
System.out.println("start=" + start);

//读取全部报文
byte[] msg = new byte[start];

msg = baos.toByteArray();
System.out.println("hex=" + IsoUtil.hexString(msg));//报文内容
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


输出和异常:

~~~~~~~接受报文开始~~~~~~
from ip:/192.168.1.111:2059
Len=2
hex=003C
megLen=60
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
in while, len=2
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.DataInputStream.read(Unknown Source)
at com.hyt.pos.PosReceiver.run(PosReceiver.java:52)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

[解决办法]
引用:

Quote: 引用:

你这个input的流在第一个while循环里面已经读到末尾了,所以返回-1后退出第一个循环。
而你的第二个while循环任然再去使用input读取数据,这个时候的input流里面肯定没有东西让你再继续读下去了,又因为input.read()是个阻塞的方法,会一直等待下一个字节的出现,从而导致timeout。

我觉得不是这样的,我一次只读了2个字节,而且总长度是60,第二个while里也读了29次,然后应该结束的,但他没有,一直到报time out退出。
我在想是不是因为socket是保持连接的,所以read方法没有退出,一直等到time out才退出。


额,我刚看错了,你的第一个while循环只读取了2个字节,就break掉了,我囧啊。第二个循环读取58个字节,打印出结果都是对的。之所以没有退出,的确是因为你的socket是保持连接的,这个是正常的,因为你的连接不是只发送一次数据就断开了,而是保持一个长连接,服务器等待你的client发送下一次的消息。

你如果想要让input.read()返回-1而退出的话,需要你的client端关闭连接,即socket.close()后,就是正常退出了。

热点排行
Bad Request.