黑马程序员技术交流社区
标题:
关于Socket的问题
[打印本页]
作者:
希望的曙光
时间:
2013-1-17 17:03
标题:
关于Socket的问题
import java.net.*;
import java.io.*;
public class recserSever {
public static void main(String[] args)throws Exception {
ServerSocket ss=new ServerSocket(3004);
boolean Rruning =true;
while(Rruning){
Socket s=ss.accept();
new Thread(new Servecis(s)).start();
}
ss.close();
}
}
class Servecis implements Runnable{
Socket s;
public Servecis(Socket s){
this.s=s;
}
public void run(){
try{
InputStream ips=s.getInputStream();
OutputStream ops=s.getOutputStream();
BufferedReader bff=new BufferedReader(new InputStreamReader(ips));
PrintWriter pw=new PrintWriter(ops);
while(true){
String str= bff.readLine();
if(str.equalsIgnoreCase("bye")){ break;
}
String sStr=new StringBuffer(str).reverse().toString();
pw.println(sStr);
}
bff.close();
pw.close();
s.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}java.lang.NullPointerException
at heima.cmo.Servecis.run(recserSever.java:31)
at java.lang.Thread.run(Unknown Source)
大家帮忙看看这段代码有什么不对的地方?为什么我在关闭客户端的时候红色标记的哪一行会出现这样的异常:
作者:
肖亚光
时间:
2013-1-17 17:07
本帖最后由 肖亚光 于 2013-1-17 17:20 编辑
ss.close(); 这个好像没有意义吧
不知道哪行是红色标记
是不是你这个循环出问题的呢?
while(true){
String str= bff.readLine();
if(str.equalsIgnoreCase("bye")){ break;
}
String sStr=new StringBuffer(str).reverse().toString();
pw.println(sStr);
}
当你客户端关闭的时候
由于while(true) 还是会继续从你的客户端读数据 但是现在客户端已经关闭了s了,或者你的客户端也没有告诉服务端什么时候s.shutdownOutput()的
是不是这个原因呢?
个人意见
作者:
苏克
时间:
2013-1-18 16:39
关闭异常的语句必须放在finally语句中,这一点你就没做到,即使没出异常你的代码也是不合格的。
class Servecis implements Runnable{
Socket s;
InputStream ips;
OutputStream ops;
BufferedReader bff;
PrintWriter pw;
public Servecis(Socket s){
this.s=s;
}
public void run(){
try{
ips=s.getInputStream();
ops=s.getOutputStream();
bff=new BufferedReader(new InputStreamReader(ips));
pw=new PrintWriter(ops);
while(true){
String str= bff.readLine();
if(str.equalsIgnoreCase("bye")){ break;
}
String sStr=new StringBuffer(str).reverse().toString();
pw.println(sStr);
}
}
catch(Exception e){
e.printStackTrace();
}
finally{
try {
bff.close();
pw.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
我试了并没有异常。你第一段代码的 ss.close();没有什么意义。
去掉就可以了
作者:
苏克
时间:
2013-1-18 16:43
对于上述问题的补充,其实在关闭资源的时候,一般为了提高健壮性,是药判断一下,资源是否为null,不是null的时候在关闭。这样可以减少异常的抛出,避免已经关闭资源了在进行关闭出现的空指针异常。
即if(bff!=null)
bff.close();所有有需要的关闭的最好都加上这句话。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2