高手,您好:
    我在写一个im系统.碰到了DataInputStream实体的readUTF方法在读取对面的网络C端的节点进行写出的数据的“EOFException”的异常的问题...
    希望得到高手的点拨:
    我将接收端的代码进行:
     public void receiveTheData(){
try {
DataInputStream dips3 = new DataInputStream(so3.getInputStream());
while(true){
C_portManageRecvDportData m8 = new C_portManageRecvDportData(so2);
m8.start(); 
try{
buffertemp3 = dips3.readUTF();
}catch(EOFException e){
System.out.println(buffertemp3);
String[] bufferData3 = buffertemp3.split("[#]");
sign3 = Integer.parseInt(bufferData3[0]);
para3 = Integer.parseInt(bufferData3[1]);
SocketInfo = bufferData3[2];
switch(sign3){
case 0:
{
switch(para3){
case 0:
{
break;
}
}
}

case 1:
{

}

case 2://接收S端的数据,让C端的客户端将好友的消息进行接收.
{
DataOutputStream dops3 = new DataOutputStream(so3.getOutputStream());
ManageC_portRecv_chatwordChannel1 m1 = new ManageC_portRecv_chatwordChannel1(SocketInfo,dops3,dips3);
m1.start();
PlaySysAudio.Play(InfoAccessPath);
break;
}
case 4://接收S端传至C端的好友IP地址。
{
casebuffer = SocketInfo.split("[|]");
case 3://
{
MySystemserialnum = Integer.parseInt(SocketInfo);
break;
}
MyFriIP = casebuffer[0];
MyFriPort = casebuffer[1];
MyFriNum = casebuffer[2];
MyFriRole = casebuffer[3];
PlaySysAudio.Play(IPAccessPath);
break;
}
case 10:
{
ManageGetTheS_port_PayForTheSysFuctionSignal m10 = new ManageGetTheS_port_PayForTheSysFuctionSignal(para3,SocketInfo);
m10.start();
break;
}
}
}
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 
}]
    因为每一个用户的“向S端输入”都是会有一个“结尾”的,当发生EOFException的时候,我采用:“让程序捕获这个场景”“然后执行之后的S端代码”,就是我的上文程序的第9行的“{”到第61行“}”的作用域所标识的“catch(EOFException){....}”的作用域所进行的“用户输入完毕后”“执行S端的代码”的逻辑实现来进行“S端的EOFException”的处理.
    希望得到高手的点拨:
    我的这个代码实现方案,能否将这里S端的EOFException的问题进行解决..?
    谢谢高手!!
    一百分奉上
                                                      一位日日夜夜向着理想奔跑的筑梦者 
                                                     2013年10月29日星期二早晨2点39分socket通信异常EOFException

解决方案 »

  1.   

    帮助我的朋友,不好意思,刚才没有仔细检查,我的上文中的代码还有一些问题,经过修改,我的代码如下:
        import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.EOFException;
    import java.io.IOException;class CJ{
    public void receiveTheData(){
            try {
                DataInputStream dips3 = new DataInputStream(so3.getInputStream());
                while(true){
                C_portManageRecvDportData m8 = new C_portManageRecvDportData(so2);
                m8.start(); 
                try{
                buffertemp3 = dips3.readUTF();
                }catch(EOFException e){
                System.out.println(buffertemp3);
                String[] bufferData3 = buffertemp3.split("[#]");
                sign3 = Integer.parseInt(bufferData3[0]);
                para3 = Integer.parseInt(bufferData3[1]);
                SocketInfo = bufferData3[2];
                switch(sign3){
                case 0:
                {
                    switch(para3){
                    case 0:
                    {
                        break;
                    }
                    }
                }
                 
                case 1:
                {
                     
                }
                 
                case 2://接收S端的数据,让C端的客户端将好友的消息进行接收.
                {
                DataOutputStream dops3 = new DataOutputStream(so3.getOutputStream());
                ManageC_portRecv_chatwordChannel1 m1 = new ManageC_portRecv_chatwordChannel1(SocketInfo,dops3,dips3);
                m1.start();
                    PlaySysAudio.Play(InfoAccessPath);
                    break;
                }
                case 4://接收S端传至C端的好友IP地址。
                {
                    casebuffer = SocketInfo.split("[|]");
                }
                case 3://
                {
                    MySystemserialnum = Integer.parseInt(SocketInfo);
                    break;
                }
                case 4:
                {
                    MyFriIP = casebuffer[0];
                    MyFriPort = casebuffer[1];
                    MyFriNum = casebuffer[2];
                    MyFriRole = casebuffer[3];
                    PlaySysAudio.Play(IPAccessPath);
                    break;
                }
                case 10:
                {
                    ManageGetTheS_port_PayForTheSysFuctionSignal m10 = new ManageGetTheS_port_PayForTheSysFuctionSignal(para3,SocketInfo);
                    m10.start();
                    break;
                }
                }
                }
                }
                     
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
      
    }}
        希望得到高手的点拨:
        我的代码,还有什么地方有问题吗?
        我能够实现我的“S端的业务功能不受影响”并且“S端将EOFException异常的问题解决”两个目标的实现吗...?
        谢谢高手!!
      

  2.   

     坐等高手。。socket搞得不是很多。
      

  3.   

    我记得回复过一个类似的问题,那个readUTF方法用的不是很好,最好重新写个读流
      

  4.   

    EOFException表示输入过程中意外地到达文件尾或流尾的信号。
    如果抛出异常的话,
     System.out.println(buffertemp3);
    输出的是什么内容?
    只是最后一部分未输出么?
      

  5.   

    withiter版主,谢谢您的点拨!!
    也谢谢caofeng891102,与失落夏天的关注!!
    withiter版主,现在我参考您上回面向硬盘中的文件的读方法的手迹,写了下面的面向Socket网络流的读方法,但个人感觉不是很好,希望得到您的点拨...
        我的读方法代码为:
        static String readsocketUTF(Socket s){
    DataInputStream read = null;
    try {
    read = new DataInputStream(s.getInputStream());
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    String msg = "";
    String info = "";
    msg  = info;   
    while(true){ 
    try {
    info  = read.readUTF();
    }catch(EOFException e){
    break; 
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    msg =  msg + info; 
    return msg;

    }
        我觉得这个读方法,应该能够解决从网络中传输过来的数据的“逐个判断”问题:
        因为每一个从网络中写过来的String,“都一定是有一个结尾的”,如果进行了本方法的应用后,在网络中如果碰到写过来的一组字符串的话,会有“每一笔s端的业务碰到结尾的时候,都会抛出EOFException”的场景,从而出现:
        首先网络中写过来的数据在第14行赋值给info变量,然后,到达网络中String变量的结尾,执行catch,捕捉这里的“EOFException”,然后,程序走到第16行,break,程序到达第22行,将info中接收到的网络中传输过来的数据,交给msg,之后,msg被作为返回值,返回.
        希望得到CSDN中的高手和withiter版主尽快的回复:
        我的这个方法的写法,能不能解决“EOFException”的异常..?
        谢谢CSDN中的高手,谢谢withiter版主,我的老师,谢谢CSDN,我的大学!!
      

  6.   

    用字节流吧,别用readUTF()啦。
    http://bbs.csdn.net/topics/390550706
      

  7.   

    withiter版主,谢谢您的点拨!!
    也谢谢caofeng891102,与失落夏天的关注!!
    withiter版主,现在我参考您上回面向硬盘中的文件的读方法的手迹,写了下面的面向Socket网络流的读方法,但个人感觉不是很好,希望得到您的点拨...
        我的读方法代码为:
        static String readsocketUTF(Socket s){
    DataInputStream read = null;
    try {
    read = new DataInputStream(s.getInputStream());
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    String msg = "";
    String info = "";
    msg  = info;   
    while(true){ 
    try {
    info  = read.readUTF();
    }catch(EOFException e){
    break; 
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    msg =  msg + info; 
    return msg;

    }
        我觉得这个读方法,应该能够解决从网络中传输过来的数据的“逐个判断”问题:
        因为每一个从网络中写过来的String,“都一定是有一个结尾的”,如果进行了本方法的应用后,在网络中如果碰到写过来的一组字符串的话,会有“每一笔s端的业务碰到结尾的时候,都会抛出EOFException”的场景,从而出现:
        首先网络中写过来的数据在第14行赋值给info变量,然后,到达网络中String变量的结尾,执行catch,捕捉这里的“EOFException”,然后,程序走到第16行,break,程序到达第22行,将info中接收到的网络中传输过来的数据,交给msg,之后,msg被作为返回值,返回.
        希望得到CSDN中的高手和withiter版主尽快的回复:
        我的这个方法的写法,能不能解决“EOFException”的异常..?
        谢谢CSDN中的高手,谢谢withiter版主,我的老师,谢谢CSDN,我的大学!!你那个自己实现的方法里还是用的readUTF,还是会出现那个EOF异常的。建议你用BufferedReader 封装下再读取private static String readsocketUTF(Socket s){
    String msg = "";
    try {
    InputStreamReader read = new InputStreamReader(s.getInputStream(),"UTF-8");
    BufferedReader reader = new BufferedReader(read);

    String info = reader.readLine();
    msg = info;
    while (true) {
    info = reader.readLine();
    if (info == null)
    break;
    msg = msg + info;
    }

    } catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return msg; }
      

  8.   

    定义一下数据包上限大小吧。 比如一个数据包支持1M,这样,如果服务端有3M数据要写到客户端,你可以采取短信协议处理长短信的方式来做,比如数据包开头固定几个字节表示数据信息,比如:3,1,2 这样表示有3个数据包,当前是第1个,剩下还有2个,全部接收完,你合并起来统一处理咯。用nio.buffer+字节流就可以了。仅供参考、、
      

  9.   

    withiter版主,顺溜哥,谢谢您们的点拨!!
    也谢谢Mr叶哥的点拨!!
    由于顺溜哥在线上又为弟我做了QQ辅导..
    叶哥,版主,弟我,手里只有100分,弟我暂时将分数进行了上面的划分...
    谢谢叶哥的关注!!
    今后有事情,如果能够见面的话,弟我,一定补上您今天的人情!!