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();
为什么我运行,控制台什么信息都没有输出,请帮助看一下是哪里写漏东西了。谢谢。
展开
 我来答
百度网友b8f909b
2012-11-20 · TA获得超过795个赞
知道小有建树答主
回答量:554
采纳率:0%
帮助的人:474万
展开全部
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。
另外你的程序看起来是不是没有写异常捕捉?还是省略不写在这里。
更多追问追答
追问
第一句话说的给力。赞一个。明白是明白了,但你这样改程序不是我要的结果,客户端也没有信息回来。楼上那位改的是我要的结果。
socket.shutdownoutput()为什么要放在pw.close()后面?
追答
客户端没有信息回来是因为服务器卡在了while循环那里了,下面的那些向客户端write的信息根本就执行不到。socket.shutdownoutput()只是把输出流置于流的末尾,应该放在close前面,下面那位仁兄说的是放在flush后面,他说的是对的,但是他也看错了,你本来就是放在flush后面的。
Blood_Dupre
2012-11-20
知道答主
回答量:20
采纳率:0%
帮助的人:22.9万
展开全部
客户端
socket.shutdownOutput();要写在pw.flush();后面
更多追问追答
追问
有输出了,但不知道原因。
socket.shutdownoutput()是关闭此字节流吧。为什么要放在pw.close()后面?
追答
不是放到pw.close()后面,而是放到pw.flush()后面;
因为客户端同时向服务器发送输出流和输入流,而流用完后需要关闭,才能继续下一个
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式