高手,您好:        我在进行一个CS结构聊天工具Socket编程的时候,碰到了下面的场景:        我的S端的主框架的“接收用户请求”的代码为:        DataInputStream dips3 = new DataInputStream(so3.getInputStream());
           while(true){
           C_portManageRecvDportData m8 = new C_portManageRecvDportData(so2);
           m8.start(); 
           String buffertemp3 = dips3.readUTF();
           System.out.println(buffertemp3);
           String[] bufferData3 = buffertemp3.split("[#]");
           sign3 = Integer.parseInt(bufferData3[0]);            para3 = Integer.parseInt(bufferData3[1]);
           SocketInfo = bufferData3[2];
           MySysRole = bufferData3[3];           在我将主框架中将readUTF()方法接收到的用户的Socket请求的对象所发来的字符串的时候。        我得到了我的MyEclipse编译器报出:        EOFException异常的错误.        经查,原因是由于:        readUTF()方法在进行接收的过程中意外到达文件或流的末尾时,抛出此异常。        我采用了“如下的代码”解决这个问题:
        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];
MySysRole = bufferData3[3];
if(MySysRole.equals("S")){
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 3://
{
MySystemserialnum = Integer.parseInt(SocketInfo);
break;
}
case 4://接收S端传至C端的好友IP地址。
{
casebuffer = SocketInfo.split("[|]");
MyFriIP = casebuffer[0];
MyFriPort = casebuffer[1];
MyFriNum = casebuffer[2];
MyFriRole = casebuffer[3];
PlaySysAudio.Play(IPAccessPath);
break;
}
case 5:
{
new NoteUserTheChargeOfAuthorize(dops2);
break;
} }
}else{
switch(C_portManageRecvDportData.sign2){
case 1:
{
if(C_portManageRecvDportData.para2==0){
ManageC_port_MDSpara0Channel_Thread m0 = new ManageC_port_MDSpara0Channel_Thread(C_portManageRecvDportData.buffer2,C_portManageRecvDportData.para2);
m0.start();
semaphore = 1;
break;
}
} case 2:
{
new NoteUserTheChargeOfAuthorize(dops2);
PlaySysAudio.Play(NoteUserTheChargeOfauthrioze);
break;
} case 10:
{
ProtectOurCopyRight m10 = new ProtectOurCopyRight(SocketInfo,so2);
m10.start();
}

}
}
}
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 
}
      求高手点拨:
      我的上文中的代码,是否能够解决这里的“EOFException”的异常...?
      并且,这里的代码所碰到的问题:
      EOFException,如果不能通过我的“进行捕获异常”的方式,进行解决的话..
      我应该采用什么办法,将这里的问题,解决...?
      谢谢高手!!
      一百分奉上!!
                                                             一位日日夜夜向着理想奔跑的筑梦者
                                                             2013年10月28日下午1点58分异常处理通信socket聊天工具

解决方案 »

  1.   

    看下为什么会抛出此异常吧,主要是readUTF这个方法,你要判断下有多少字节才可以使用readUTF:读入一个已使用 UTF-8 修改版格式编码的字符串。readUTF 的常规协定是:该方法读取使用 UTF-8 修改版格式编码的 Unicode 字符串的表示形式;然后以 String 的形式返回此字符串。    首先读取两个字节,并使用它们构造一个无符号 16 位整数,构造方式与 readUnsignedShort 方法的方式完全相同。该整数值被称为 UTF 长度,它指定要读取的额外字节数。然后成组地将这些字节转换为字符。每组的长度根据该组第一个字节的值计算。紧跟在某个组后面的字节(如果有)是下一组的第一个字节。    如果组的第一个字节与位模式 0xxxxxxx(其中 x 表示“可能为 0 或 1”)匹配,则该组只有这一个字节。该字节被左侧补零,转换成一个字符。    如果组的第一个字节与位模式 110xxxxx 匹配,则该组只由字节 a 和另一个字节 b 组成。如果没有字节 b(因为字节 a 是要读取的最后一个字节),或者字节 b 与位模式 10xxxxxx 不匹配,则抛出 UTFDataFormatException。否则,将该组转换成字符:    (char)(((a& 0x1F) << 6) | (b & 0x3F))
             如果组的第一个字节与位模式 1110xxxx 匹配,则该组由字节 a 和另外两个字节 b 和 c 组成。如果没有字节 c(因为字节 a 是要读取的最后两个字节之一),或者字节 b 或字节 c 与位模式 10xxxxxx 不匹配,则抛出 UTFDataFormatException。否则,将该组转换成字符:
         (char)(((a & 0x0F) << 12) | ((b & 0x3F) << 6) | (c & 0x3F))
             如果组的第一个字节与模式 1111xxxx 或模式 10xxxxxx 匹配,则抛出 UTFDataFormatException。    如果在执行整个过程中的任意时间遇到文件末尾,则抛出 EOFException。    在通过此过程将每个组转换成字符后,按照从输入流中读取相应组的顺序,将这些字符收集在一起,形成一个 String,然后该字符串将被返回。    可以使用 DataOutput 接口的 writeUTF 方法写入适合此方法读取的数据。    返回:
            一个 Unicode 字符串。 
        抛出:
            EOFException - 如果此流在读取所有字节之前到达末尾。 
            IOException - 如果发生 I/O 错误。 
            UTFDataFormatException - 如果这些字节不表示一个有效的、UTF-8 修改版编码的字符串。================================================
    建议自己写一个读的方法,自带的实现我觉得比较烂,参考代码:private static String readUTF(String fn) throws Exception{
    File f = new File(fn);
    InputStreamReader  read = new InputStreamReader (new FileInputStream(f),"UTF-8");
    BufferedReader reader=new BufferedReader(read);
    String msg = "";
    String info = reader.readLine();
    msg  = info;   
    while(true){ 
    info  = reader.readLine();
    if(info==null) break; 
    msg =  msg + info; 

    return msg;}
      

  2.   

    谢谢版主huxiweng的点拨!!
        今后有机会,一定回报您的相助之恩!!
      

  3.   

        版主,请问:
        如果我采用刚刚实施的这个页面中的方案,是否能够得到我的问题的解决?
        :
        http://bbs.csdn.net/topics/390627129
        谢谢版主!!