A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 庄承荣 黑马帝   /  2011-11-7 00:09  /  2114 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请大家帮忙看一下下面的程序哪里有问题,可以输出“debug 1 ...” ,但无法输出"debug 2 ..." , ip 地址没错
  1. class TcpClient2{
  2.         public static void main(String[] args) throws Exception{
  3.                 System.out.println("clint start...");
  4.                 Socket s = new Socket("192.168.1.2",10005);
  5.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  6.                 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  7.                 String sendDataStr=null;
  8.                 while((sendDataStr=br.readLine())!=null){
  9.                         if(sendDataStr.equals("bye")){
  10.                                 break;
  11.                         }
  12.                         bw.write(sendDataStr);
  13.                         bw.flush();
  14.                 }
  15.                 bw.close();
  16.         }
  17. }

  18. class TcpServer2{
  19.         public static void main(String[] args) throws Exception{
  20.                 System.out.println("server start...");
  21.                 ServerSocket ss = new ServerSocket(10005);
  22.                 Socket s = ss.accept();
  23.                 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
  24.                 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  25.                 String receiveDataStr=null;
  26.                 System.out.println("debug 1 ...");
  27.                 while((receiveDataStr=br.readLine())!=null){
  28.                         System.out.println("debug 2 ...");
  29.                         if(receiveDataStr.equals("bye")){
  30.                                 break;
  31.                         }
  32.                         System.out.println("receive data:"+receiveDataStr);
  33.                 }
  34.                 s.close();
  35.                 ss.close();
  36.         }
  37. }
复制代码

4 个回复

倒序浏览
当你启动服务端程序时,客户端没有数据传输。这时br.readLine()方法是读不到任何数据的。这时赋值语句receiveDataStr=br.readLine()的值依然是null。判断条件为false。这时程序不会进入循环体内部。所以服务端程序直接运行到最后,直接退出了。

你写的程序有问题。

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼主程序没问题,只是在客户端写入数据里,忘记加 bw.newLine();
因为 readLine()  方法为阻塞式方法,只有当它读到 换行字符是,程序才会接着往下执行。就这是 无法输出"debug 2 ..." 的原因所在。
解决方法            bw.write(sendDataStr);
                        bw.newLine();
                        bw.flush();

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
你在Server端使用的是读一行的方法,该方法必需读到“\r\n”的结束标记才会结束,TcpClient端的writer(String str)方法,并没有发送结束标记,所以Server端会一直等待在receiveDataStr=br.readLine()处。
解决办法 : 在TcpClient端的bw.write(sendDataStr) 后加bw.newLine()方法。

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
谢谢各位了,问题已经解决{:soso_e100:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马