各位师兄:
   大家好。最近在做一个SOCKET通信程序。如下:    public static void main(String[] args) {
      try
               Socket  telSocket = new Socket(host, port);
           DataInputStream  tel_in = new DataInputStream(telSocket.getInputStream());
         OutputStream  tel_out = telSocket.getOutputStream();
//////////////一连接上后就发送一个请求指令,这样服务端就会回送信息
                String note = "ask readyok" + "\n";
                tel_out.write(note.getBytes());
                tel_out.flush();
                System.out.println("send note is ok!");
    ////当连接保持的时候进行收发信息      
               while (!telSocket.isClosed()) {
                tel_len = tel_in.readInt();
                System.out.println(tel_len);
                if (tel_len > 4092) {
                    tel_len = 4092;
                }
                byte buf[] = new byte[tel_len];                System.out.println("read is ok!");///接收信息OK
                tel_in.read(buf);
                String revice = new String(buf).trim();
                System.out.println(revice);///打印显示出接收的信息
                
                ///每收到信息后就要向服务端发送一条心跳确认   
                String heard = "heard is jump"+ "\n";
                tel_out.write(heard.getBytes());
                tel_out.flush();
                System.out.println("send heard is ok!"+heard); 
          }  
}     
     catch (Exception e) {
            System.out.println("connect telnet fail:" + host + ":" +
                               port + e);
        }
}
程序运行调试的时候,我发现程序运行到循环体即while (!telSocket.isClosed()) 内时,第一次收发是正常的,第二次运行到tel_len = tel_in.readInt();就跳出异常了显示:java.io.EOFException!!!
我试了一下,如果把向服务端发送心跳确认的这部分代码屏蔽掉,那就可以读取正常了.这是为什么呢???如何能做到收发正常呢???
  谢谢赐教. 

解决方案 »

  1.   

    你得服务端代码呢?看看那有什么问题
    还有
    看看
    if (tel_len > 4092) {
                        tel_len = 4092;
                    }
    有没有进入这句话
      

  2.   

    因为程序在UNIX上,所以只能通过System.out.printl来单步调试状态,我试了一下,奇怪,今天的问题变成:
    运行到循环体即while (!telSocket.isClosed()) 内时,第一次收发是正常的,第二次也正常,第三次运行到tel_len = tel_in.readInt();就跳出异常了,显示信息变成了:java.net.SocketException:connection reset
    何解???
      

  3.   

    当然会出问题,你的循环里面是先读取一个int值,然后再读取byte[]这就要求,你在那边要先发一个int值,再发一个byte[]这样对应,否则就会出异常的
      

  4.   

    TO lbfhappy(千里冰封):
      嗯,好象是这样,我刚才又调试了一下,每次当服务端把一组信息转送结束后,这时再运行到
    tel_len = tel_in.readInt();就出错了。
    跳出异常了显示:java.io.EOFException!!!
    应该如何解决呢???谢谢
      

  5.   

    blog 更新:
     think in java 各章后练习答案.....
     http://blog.csdn.net/heimaoxiaozi/
      

  6.   

    tel_len = tel_in.readInt();你上面这句是干什么啊?这一句一次要读入接下来的4个字节,如果你服务端剩余的不够4个字节就会出错。一般都是定义1024或者更大一些1024倍数的数组,太大浪费内存比较多了。然后调用read(byte[] b) ,通过这个函数的返回值来判断总共读入了多少字节。然后跟1024比较得到后面还有没有数据。
    或者你这种要自己程序里面定义好,服务器开始的地方一次性发送我要送多少字符的数据,然后只在最开始读入总共多少字节,一次4092的话自己算总共要读多少次。或者像你的程序应该是服务器端每隔4092发送一次后面4092字节内还有多少字节会被发送(好像一般不会这么干的,呵呵)
    以上。
      

  7.   

    up up
    现在我也遇到了这个问题了
    不是挖坟
    静待解决