高手,您好:
我在做一个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
我在做一个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
dops.writeUTF("Hello_world");
dops.close(); // 这个
s.close(); // 这个
服务器端也要。
求CSDN中的高手,版主,诸位神佛的关注点拨!!
Mark!!
ldh911哥!!
谢谢您的点拨!!
弟我马上去试!!
为什么会有:如果我在进行S端的代码设计的时候,不进行“流的资源”和“Socket水管的资源”的关闭回收的话..
会有:我的S端的系统出现“连接重置”的问题..?
弟我在写弟我的项目的时候,S端是面对数百位用户连接的进行的..
在弟我“不关闭资源”的代码书写的程序中..弟我没有碰到过“连接重置”的问题的印象..
弟我希望能够得到ldh911哥的点拨:
这里的“连接重置”的原理,是什么...?
希望ldh911哥,能够从Socket和流的底层原理上告诉弟我:
这里的问题,是什么原因造成的...?
谢谢ldh911哥!!
谢谢版主withiter哥的关注!!
ldh911哥,弟我100分奉上!!
a、 首先打印的原因connection reset的原因是你Client端没有阻塞你write以后就直接程序都运行完了,进程被关掉以后操作系统把你client端打开的socket直接关掉了,但是server不知道,所以在你lib类里尝试去读取消息的时候就会发现这个socket已经进入异常的状态,就抛异常了
b、 为什么会不停的循环,因为你lib类里读取消息的代码捕获到异常了以后没有break,还在不停的尝试打印,你这个处理异常的逻辑是错误的。
withiter版主,由于弟我的分数有限,这回,弟我暂时未能够将您能够感兴趣的分数交给您..
日后有机会,弟我会:
认认真真地回报您今天的人情!!