黑马程序员技术交流社区

标题: 服务端从键盘录入数据,客户端转成大写,返给服务端,..... [打印本页]

作者: 谢冬    时间: 2013-3-12 23:09
标题: 服务端从键盘录入数据,客户端转成大写,返给服务端,.....
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintWriter;
  5. import java.net.Socket;

  6. public class ClientDemo2 {
  7.         public static void main(String[] args) throws IOException {
  8.                 Socket s = new Socket("192.168.1.101", 10010);
  9.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  10.                 PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
  11.                 String line = null;
  12.                 while((line = br.readLine()) != null)
  13.                 {
  14.                         if("over".equals(line))
  15.                                 break;
  16.                         pw.println(line);
  17.                         pw.flush();
  18.                 }
  19.                
  20.                
  21.                 BufferedReader br1 = new BufferedReader(new InputStreamReader(s.getInputStream()));
  22.                 PrintWriter pw1 = new PrintWriter(System.out, true);
  23.                 String newLine = null;
  24.                 while((newLine = br1.readLine()) != null)
  25.                 {
  26.                         pw1.println(newLine);
  27.                         pw1.flush();
  28.                 }
  29.                 pw1.close();
  30.                 br.close();
  31.                 s.close();
  32.         }
  33. }
  34. import java.io.BufferedReader;
  35. import java.io.IOException;
  36. import java.io.InputStreamReader;
  37. import java.io.PrintWriter;
  38. import java.net.ServerSocket;
  39. import java.net.Socket;

  40. public class ServerDemo2 {
  41.         public static void main(String[] args) throws IOException {
  42.                 ServerSocket ss = new ServerSocket(10010);
  43.                         Socket s =  ss.accept();
  44.                         BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
  45.                         PrintWriter pw = new PrintWriter(s.getOutputStream());
  46.                         String line = null;
  47.                         while((line = br.readLine()) != null)
  48.                         {
  49.                                 pw.println(line.toUpperCase());
  50.                                 pw.flush();
  51.                         }
  52.                         pw.close();
  53.                         s.close();
  54.         }
  55. //输入over以后,能够转成大写,但是程序并没有结束,这是为什么?
复制代码

作者: 夏晓彤    时间: 2013-3-12 23:24
这程序只关闭了客户端,并没有关闭服务器 s.close();是关闭客户端
ss.close()才是关闭服务器,但是一般都不会关闭服务器的,只要关闭客户端就可以了,试想你访问新浪,访问新浪,客户端用户访问一次服务器就关闭了,那其他哥们姐妹们就要去喝西北风去了,新浪不得亏死啊
作者: HM黄祥为    时间: 2013-3-13 00:31
                while((newLine = br1.readLine()) != null)//实际上你的程序是运行到这个地方开始阻塞的  即卡住了   从而导致客户端程序无法退出
                {
                        pw1.println(newLine);
                        pw1.flush();
                }
                pw1.close();
                br.close();
                s.close();
        }
为什么你的程序会在那里卡住了呢   首先由于你的流在读取的时候没有关闭 而 br1.readLine()  这里你使用的是readline的方法 即读取一行数据  何为一行 即 直到读取到有行结束符时 这个方法才会返回 否则会一直阻塞
这样明白了吧   就是说 你这里服务端和客户端之间的流并未关闭 并且 服务端又没有发送换行符 所以  这个方法就阻塞了  程序自然不会结束  
其实你可以使用br1.ready()  这个方法  来判断这个流是否为空  把这个方法调用放在while循环前  判断下 如果为false则流为空  或者 无法读取  这是  你直接关闭socket即可推出程序
作者: 陈丽莉    时间: 2013-3-13 05:26
试试,二楼的方法是否奏效,若还有问题,请继续追问~ 若没有问题了,记得回复二楼的方法是否管用,然后将帖子分类改成【已解决】~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2