java里的socket基础知识,在线等。小问题找原因。
服务器:ServerSocketss=newServerSocket(8800);Socketsocket=ss.accept();InputStreamis=socke...
服务器:
ServerSocket ss=new ServerSocket(8800);
Socket socket=ss.accept();
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
String str=null;
while(!((str=br.readLine())==null)){
System.out.println("这里是宠物店,宠物的主人信息是:"+str);
}
String reply="欢迎光临宠物店!";
pw.write(reply);
pw.flush();
br.close();
isr.close();
is.close();
pw.close();
os.close();
socket.close();
ss.close();
客户端:
Socket socket =new Socket("localHost",8800);
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String str="您好,我有一条狗需要看病!";
pw.write(str);
pw.flush();
String reply=null;
while(!((reply=br.readLine())==null)){
System.out.println("宠物店回的信息是:"+reply);
}
socket.shutdownOutput();
br.close();
isr.close();
is.close();
pw.close();
os.close();
socket.close();
为什么我运行,控制台什么信息都没有输出,请帮助看一下是哪里写漏东西了。谢谢。 展开
ServerSocket ss=new ServerSocket(8800);
Socket socket=ss.accept();
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
String str=null;
while(!((str=br.readLine())==null)){
System.out.println("这里是宠物店,宠物的主人信息是:"+str);
}
String reply="欢迎光临宠物店!";
pw.write(reply);
pw.flush();
br.close();
isr.close();
is.close();
pw.close();
os.close();
socket.close();
ss.close();
客户端:
Socket socket =new Socket("localHost",8800);
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String str="您好,我有一条狗需要看病!";
pw.write(str);
pw.flush();
String reply=null;
while(!((reply=br.readLine())==null)){
System.out.println("宠物店回的信息是:"+reply);
}
socket.shutdownOutput();
br.close();
isr.close();
is.close();
pw.close();
os.close();
socket.close();
为什么我运行,控制台什么信息都没有输出,请帮助看一下是哪里写漏东西了。谢谢。 展开
2个回答
展开全部
while(!((str=br.readLine())==null))这句话看得我蛋疼,你就不能写!=null吗?
你的程序是卡在了服务器读数据那里。因为BufferedReader的readLine函数是必须读到换行符才会有返回值的,也就是说你客户端发送的字符串必须有换行。所以这句话应该加个换行符String str="您好,我有一条狗需要看病 " + "\n";服务器那边的字符串也要这样做。这样做了以后服务器会打印欢迎信息了,但是程序还是会卡在那里(while那里),因为你的readLine只有读到数据流最末尾,才返回null,在网络上,一直等待输入,即使是对方什么也不输入,只是回车,readline也不会返回null,如果I/O中断,会返回I/O异常,还是不会返回null,除非你使用的数据流有固定长度(比如文件数据流,或者ByteArrayInputStream之类),而不是网络数据流(阻塞模式)。
所以你必须定义一个结束的方式,例如!("quit".equals(str=br.readLine()))也就是读到的一行字符串不等于quit。
另外你的程序看起来是不是没有写异常捕捉?还是省略不写在这里。
你的程序是卡在了服务器读数据那里。因为BufferedReader的readLine函数是必须读到换行符才会有返回值的,也就是说你客户端发送的字符串必须有换行。所以这句话应该加个换行符String str="您好,我有一条狗需要看病 " + "\n";服务器那边的字符串也要这样做。这样做了以后服务器会打印欢迎信息了,但是程序还是会卡在那里(while那里),因为你的readLine只有读到数据流最末尾,才返回null,在网络上,一直等待输入,即使是对方什么也不输入,只是回车,readline也不会返回null,如果I/O中断,会返回I/O异常,还是不会返回null,除非你使用的数据流有固定长度(比如文件数据流,或者ByteArrayInputStream之类),而不是网络数据流(阻塞模式)。
所以你必须定义一个结束的方式,例如!("quit".equals(str=br.readLine()))也就是读到的一行字符串不等于quit。
另外你的程序看起来是不是没有写异常捕捉?还是省略不写在这里。
更多追问追答
追问
第一句话说的给力。赞一个。明白是明白了,但你这样改程序不是我要的结果,客户端也没有信息回来。楼上那位改的是我要的结果。
socket.shutdownoutput()为什么要放在pw.close()后面?
追答
客户端没有信息回来是因为服务器卡在了while循环那里了,下面的那些向客户端write的信息根本就执行不到。socket.shutdownoutput()只是把输出流置于流的末尾,应该放在close前面,下面那位仁兄说的是放在flush后面,他说的是对的,但是他也看错了,你本来就是放在flush后面的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询