高手,您好: 我在进行一个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聊天工具
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聊天工具
如果组的第一个字节与位模式 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;}
今后有机会,一定回报您的相助之恩!!
如果我采用刚刚实施的这个页面中的方案,是否能够得到我的问题的解决?
:
http://bbs.csdn.net/topics/390627129
谢谢版主!!