SOCKET编程 能够运行 但是有异常 看起来很不爽!求解决办法!!

l546461042 2011-03-30 09:09:01
server方代码:
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
public class EchoServer extends Frame implements ActionListener{
private int port=8000;
private ServerSocket serverSocket;
private TextArea ServerT;
private TextArea ClientT;
private Button Send;
private Button Close;
private PrintWriter pw;
Socket socket=null;
public EchoServer()throws IOException{
serverSocket=new ServerSocket(port);
setSize(400,400);
setLocation(400,200);
setLayout(new BorderLayout());
init();
Panel p1=new Panel(new GridLayout(2,1));
p1.add(ClientT);p1.add(ServerT);
Panel p=new Panel();
p.add(Send);p.add(Close);
add(p1,BorderLayout.CENTER);
add(p,BorderLayout.SOUTH);
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e)
{
try{
if(socket!=null)socket.close();
}catch(IOException e1){
e1.printStackTrace();
}
System.exit(0);
}
});
setVisible(true);
}
public void init(){
ServerT=new TextArea(3,6);
ClientT=new TextArea("服务器启动",5,6);
Send=new Button("发送");
Close=new Button("关闭");
Send.addActionListener(this);
Close.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==Send){
if(pw!=null)pw.println(Serverecho(ServerT.getText()));
String str=null;
if(ClientT.getText().compareTo("")!=0)
str+=ClientT.getText()+"\n";
else
str="\n";
str=str+Serverecho(ServerT.getText());
ClientT.setText(str);
ServerT.setText("");
}
if(e.getSource()==Close){
try{
if(socket!=null)socket.close();
}catch(IOException e1){
e1.printStackTrace();
}
}
}
public String Serverecho(String msg){
return "静夜:"+msg;
}
private PrintWriter getWriter(Socket socket)throws IOException{
OutputStream socketOut=socket.getOutputStream();
return new PrintWriter(socketOut,true);
}
private BufferedReader getReader(Socket socket)throws IOException{
InputStream socketIn=socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public void service(){
while(true){
try{
socket=serverSocket.accept();
String str="New Connection accepted"
+socket.getInetAddress()+":"+socket.getPort();
ClientT.setText(ClientT.getText()+"\n"+str);
BufferedReader br=getReader(socket);
pw=getWriter(socket);
String msg=null;
while((msg=br.readLine())!=null){
ClientT.setText(ClientT.getText()+"\n"+msg);
}
}
catch(IOException e){
e.printStackTrace();
}
}
}
public static void main(String args[])throws IOException{
new EchoServer().service();
}
}
client方 代码:
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
public class EchoClient extends Frame implements ActionListener{
private String host="localhost";
private int port=8000;
private Socket socket;
private TextArea ClientT;
private TextArea ServerT;
private Button Send;
private Button Close;
private PrintWriter pw;
public EchoClient()throws IOException{
socket=new Socket(host,port);
init();
setSize(400,400);
setLocation(600,200);
setLayout(new BorderLayout());
Panel p1=new Panel(new GridLayout(2,1));
p1.add(ServerT);p1.add(ClientT);
Panel p=new Panel();
p.add(Send);p.add(Close);
add(p1,BorderLayout.CENTER);
add(p,BorderLayout.SOUTH);
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e)
{
try{
if(socket!=null)socket.close();
}catch(IOException e1){
e1.printStackTrace();
}
System.exit(0);
}
});
setVisible(true);
}
public void init(){
ClientT=new TextArea(3,6);
ServerT=new TextArea(5,6);
Send=new Button("发送");
Close=new Button("关闭");
Send.addActionListener(this);
Close.addActionListener(this);
try{
pw=getWriter(socket);
}
catch(IOException e){
e.printStackTrace();
}
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==Send){
pw.println(Clientcho(ClientT.getText()));
String str=null;
if(ServerT.getText().compareTo("")!=0)
str+=ServerT.getText()+"\n";
else
str="\n";
str=str+Clientcho(ClientT.getText());
ServerT.setText(str);
ClientT.setText("");
}
if(e.getSource()==Close){
try{
if(socket!=null)socket.close();
}catch(IOException e1){
e1.printStackTrace();
}
}
}
public String Clientcho(String msg){
return "一生有你:"+msg;
}
public static void main(String args[])throws IOException{
new EchoClient().talk();
}
private PrintWriter getWriter(Socket socket)throws IOException{
OutputStream socketOut=socket.getOutputStream();
return new PrintWriter(socketOut,true);
}
private BufferedReader getReader(Socket socket)throws IOException{
InputStream socketIn=socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public void talk()throws IOException{
while(true){
try{
BufferedReader br=getReader(socket);
String msg=null;
while((msg=br.readLine())!=null){
ServerT.setText(ServerT.getText()+"\n"+msg);
}
}
catch(IOException e){
e.printStackTrace();
}
}
}
}
...全文
86 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
l546461042 2011-04-05
  • 打赏
  • 举报
回复
楼上 好方法!
  • 打赏
  • 举报
回复
!socket.isClosed() 差不多了
magong 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 l546461042 的回复:]
错误出在这个模块中:(msg=br.readLine())!=null这一句
难道关闭了socket,他还在读数据?
[/Quote]
是的,你是一个循环。
这一句,改成
(!socket.isClosed() && (msg=br.readLine())!=null)
小绵羊 2011-04-01
  • 打赏
  • 举报
回复
定义一个字符串作为退出标记,当关闭窗口的时候就发送这个字符串并关闭连接,另一端接受到这个字符串后就关闭连接。
这是最标准的做法。就是约定我们读到什么的时候就退出。
l546461042 2011-04-01
  • 打赏
  • 举报
回复
问题出在这儿,无意中发现的:
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e)
{
System.exit(0);
try{
if(socket!=null)socket.close();
}catch(IOException e1){
e1.printStackTrace();
}
}
});
setVisible(true);
}
如果将上面的改成下面的,关闭窗口时候 就会跑出异常:
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e)
{
try{
if(socket!=null)socket.close();
}catch(IOException e1){
e1.printStackTrace();
}
System.exit(0);
}
});
setVisible(true);
}
这是怎么一回事?
l546461042 2011-03-31
  • 打赏
  • 举报
回复
try{
BufferedReader br=getReader(socket);
String msg=null;
while((msg=br.readLine())!=null){
ServerT.setText(ServerT.getText()+"\n"+msg);
}
}
catch(IOException e){
e.printStackTrace();
}
错误出在这个模块中:(msg=br.readLine())!=null这一句
难道关闭了socket,他还在读数据?
l546461042 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 magong 的回复:]
将EchoClient中,talk方法中的
while(true)
改成
while (!socket.isClosed())
情况会好很多。

总之,这里你用了socket,但是别人会关闭它,所以你用的时候记得时常检查能不能用了。
[/Quote]
的确情况 好很多!但是还有以下异常:
java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at EchoClient.talk(EchoClient.java:93)
at EchoClient.main(EchoClient.java:78)
l546461042 2011-03-31
  • 打赏
  • 举报
回复
楼上方法不行!运行server时候就报错了!
Exception in thread "main" java.lang.NullPointerException
at EchoServer.service(EchoServer.java:79)
at EchoServer.main(EchoServer.java:98)
magong 2011-03-30
  • 打赏
  • 举报
回复
将EchoClient中,talk方法中的
while(true)
改成
while (!socket.isClosed())
情况会好很多。

总之,这里你用了socket,但是别人会关闭它,所以你用的时候记得时常检查能不能用了。
l546461042 2011-03-30
  • 打赏
  • 举报
回复
当我关闭client窗口时候,抛出以下异常:
java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at EchoClient.talk(EchoClient.java:92)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:768)
at EchoClient.getReader(EchoClient.java:84)
at EchoClient.talk(EchoClient.java:90)
at EchoClient.main(EchoClient.java:77)
求教高手,这是怎么回事?

58,454

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧