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

关于java写的client与C写的server端的通信有关问题,

2012-01-19 
关于java写的client与C写的server端的通信问题,紧急求助! 小弟最近在编写一个java的client端,需要实时的与

关于java写的client与C写的server端的通信问题,紧急求助!

小弟最近在编写一个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;
           
            }




[解决办法]
可能timed out设置太短了
[解决办法]
看不懂你读数据的时候为什么这么写,给个解释吧。

有几个要点:
1、你需要检查InputStream的read方法的返回值,这样才能知道是否正常返回以及读出的字节数。
2、你用的read方法会阻塞,直到读满指定的那个字节数组或者EOF或者Socket关闭。
3、你的异常应该是这样得到的:你指定的大小超过了服务端写入socket的数据长度,而服务端并没有主动关闭连接。

热点排行