小弟最近在编写一个java的client端,需要实时的与server端连接获得数据。server端采用的是长连接的方式,client端连上后,server端不会主动断开。代码如下,通过如下代码的实现java编写的client端连接后时常会出现client端收不到数据的情况,最后到超时退出抛出异常。通过观察server段的日志和通过其他调试工具收发包的测试,server端收到请求后确实返回了数据,但不知道为什么Java编写的client端就是会出现时常收不到包的情况。请大家帮忙,分不够可以加。不是收不到,而是有的时候收不到,大概50%的机会收不到数据,socket一直处于read的状态,最后到超时退出,由于server端是产品,封闭的,所以只能在client端想办法,请大家救命啦!大家可以帮忙说说以前做的类似的java的client到c的server端通讯中出现的问题如何解决的。代码如下: public String socketSend(String strIp, int iPort,int iTimeOut, String cmdStr)
throws java.net.SocketException,java.net.UnknownHostException,java.io.IOException,Exception
{
String str="";
if(cmdStr==null){
return null;
}
java.net.Socket skt = null;
try
{
skt = new java.net.Socket(strIp,iPort);
}catch(Exception e)
{
return "create false";
}
skt.setSoTimeout( iTimeOut ); InputStream stream_In = null;
OutputStream stream_Out = null;
DataInputStream isr = null;
String strResult = ""; stream_In = skt.getInputStream();
stream_Out = skt.getOutputStream();
isr = new DataInputStream(stream_In);
/*send the Data to the server*/
PrintWriter writeBuf = new PrintWriter(stream_Out, true);
writeBuf.print("ZRC ZRS 000804000&&");
writeBuf.flush();
int icount = 0;
try
{
while (icount<3)
{
byte[] tmpbuff;
tmpbuff = new byte[1024];
isr.read(tmpbuff, 0, 1024);
String strTmp = new String(tmpbuff);
strResult = strResult + strTmp.trim();
icount++;
System.out.println(strTmp.trim());
}
}finally
{
isr.close();
stream_In.close();
stream_Out.close();
skt.close();
skt= null; }
System.out.println("result ---->"+strResult); return strResult;
}
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.DataInputStream.read(Unknown Source)
at com.founder.util.ZrcClientAll.socketSend(ZrcClientAll.java:165)
at com.founder.util.ZrcClientAll.main(ZrcClientAll.java:210)
不是这个原因,我设置了很大也是这样,而且server返回很实时的。
1、你需要检查InputStream的read方法的返回值,这样才能知道是否正常返回以及读出的字节数。
2、你用的read方法会阻塞,直到读满指定的那个字节数组或者EOF或者Socket关闭。
3、你的异常应该是这样得到的:你指定的大小超过了服务端写入socket的数据长度,而服务端并没有主动关闭连接。
我在read的时候,程序就阻塞在这里了,读不到数据的时候,就一直等在这里,但很奇怪的一个情况就是如果我用debug的方式去调试程序一步一步走下去,则可以很稳定的读出数据,只有在程序自己运行的时候读不出来.