高手,您好:
    我在做一个CS结构的Socket通信im系统,第一个作品,碰到了EOFException的问题..
    经过几日的研究与求教,现在我得到了两个解决方案:
    0.进行系统通信的“字节流”的传输方式的定义.
    1.进行系统通信的“字符流”传输方式的readUTF()方法的重写.
    现在,我希望得到高手的指导:
    我的第二种方案,错在什么地方..
    我做了一个实验:
    S端的源代码:
    package s;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class S_port {
String str = "";
ServerSocket s =null;
Socket so = null;
S_port(){
try {
s = new ServerSocket(60000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(true){
try {
so = s.accept();
break;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
str = Lib.readsocketUTF(so);
System.out.println(str);
}

public static void main(String[] args){
new S_port();
}
}    为了解决readUTF()方法的EOFException的问题,我进行了S端的“Lib类”的书写:
    Lib类的代码如下:
    package s;import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.Socket;public class Lib {
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;
         
    }
}    C端的代码如下:
    package s;import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;public class C_port {
Socket s = null;
DataOutputStream dops = null;
public C_port(){
try {
s = new Socket("127.0.0.1",60000);
dops = new DataOutputStream(s.getOutputStream());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
dops.writeUTF("Hello_world");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static void main(String[] args){
new C_port();
}

}    可是,在我运行了S端的代码和C端的代码之后,我得到的console窗口的提示如下:
    
    一个“不停循环动态报错的console窗口”...
    求高手点拨:
    这是怎么回事..
    应该怎么修改...?
    谢谢高手!!
    一百分奉上!!
                                                            一位日日夜夜向着理想奔跑的筑梦者
                                                           2013年10月30日早晨11点31分解决方案通信软件socketexception

解决方案 »

  1.   

    你C端发送完数据,不close连接的么?真是个坏习惯。
    dops.writeUTF("Hello_world");
    dops.close(); // 这个
    s.close(); // 这个
    服务器端也要。
      

  2.   

    自顶一个!!
        求CSDN中的高手,版主,诸位神佛的关注点拨!!
        Mark!!
      

  3.   

    OKay!!
        ldh911哥!!
        谢谢您的点拨!!
        弟我马上去试!!
      

  4.   

    ldh911哥,这个问题我想了一阵了..
        为什么会有:如果我在进行S端的代码设计的时候,不进行“流的资源”和“Socket水管的资源”的关闭回收的话..
        会有:我的S端的系统出现“连接重置”的问题..?
        弟我在写弟我的项目的时候,S端是面对数百位用户连接的进行的..
        在弟我“不关闭资源”的代码书写的程序中..弟我没有碰到过“连接重置”的问题的印象..
        弟我希望能够得到ldh911哥的点拨:
        这里的“连接重置”的原理,是什么...?
        希望ldh911哥,能够从Socket和流的底层原理上告诉弟我:
        这里的问题,是什么原因造成的...?
        谢谢ldh911哥!!
      

  5.   

    做Socket开发时,要记得一个问题就是,数据并非立即发送,有缓冲区一说;另外TCP通讯,建立连接和释放连接,都有规范的几次交互过程。而是 dops.close(); 会先执行 flush() 操作,也就是要求立即将缓冲区所有数据发送出去;然后再关闭连接,也就是发送:我要关闭连接了,请你注意;然后等对方再返回:收到,再见。而你直接程序终止,上述过程统统没有;操作系统强制回收端口资源,对方就跟被人抢劫似的结束了。
      

  6.   

    谢谢ldh911哥的点拨!!
    谢谢版主withiter哥的关注!!
    ldh911哥,弟我100分奉上!!
      

  7.   

    1. LZ你的代码极度不规范,你的命名什么的完全都不符合Java的一般规范2. 你的Socket类没关闭,这是一个很不好的习惯,不管是io还是数据库资源,用完了都要关掉3. 解答你的问题,为什么你会不停的循环打印:
       a、 首先打印的原因connection reset的原因是你Client端没有阻塞你write以后就直接程序都运行完了,进程被关掉以后操作系统把你client端打开的socket直接关掉了,但是server不知道,所以在你lib类里尝试去读取消息的时候就会发现这个socket已经进入异常的状态,就抛异常了
       b、 为什么会不停的循环,因为你lib类里读取消息的代码捕获到异常了以后没有break,还在不停的尝试打印,你这个处理异常的逻辑是错误的。
      

  8.   

    谢谢诸位大神的点拨!!
        withiter版主,由于弟我的分数有限,这回,弟我暂时未能够将您能够感兴趣的分数交给您..
        日后有机会,弟我会:
        认认真真地回报您今天的人情!!