日期:2014-05-20  浏览次数:20722 次

求高手点拨一个Socket通信的EOFException的处理方案的可行性.
高手,您好:
    我在写一个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

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

------解决方案--------------------
引用:
引用过一个类似的问题,那个readUTF方法用的不是很好,最好重新写个读流

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被作为返回值,返回.