黑马程序员技术交流社区

标题: 关于毕老师第23天网络编程(Tcp练习)的一些疑问。求解答 [打印本页]

作者: 君嘘    时间: 2015-4-10 22:10
标题: 关于毕老师第23天网络编程(Tcp练习)的一些疑问。求解答
import java.io.*;
import java.net.*;
class  TransClient
{
        public static void main(String[] args) throws Exception
        {
                Socket s=new Socket("192.168.1.101",8888);
                //键盘录入(字符转换流)
                BufferedReader bufr=
                        new BufferedReader(new InputStreamReader(System.in));
               
                //包装socket输出流
                BufferedWriter bufOut=
                        new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
               
                //包装socket读取流
                BufferedReader bufIn=
                        new BufferedReader(new InputStreamReader(s.getInputStream()));
               
                //读取键盘录入
                String line=null;
                while((line=bufr.readLine())!=null)
                {
                        //发送给服务端
                        if(line.equals("over"))
                                break;
                        bufOut.write(line);
                        bufOut.newLine();
                        bufOut.flush();
                       
                        //接服务端并打印
                        String str=bufIn.readLine();
                        System.out.println("Server:"+str);

                }
                bufr.close();
                s.close();
               

               
        }
}

class  TransServer
{
        public static void main(String[] args) throws Exception
        {
                ServerSocket ss=new ServerSocket(8888);
                Socket s=ss.accept();
                String ip=s.getInetAddress().getHostAddress();
                System.out.println(ip+"...connecting");

                BufferedReader bufIn=
                        new BufferedReader(new InputStreamReader(s.getInputStream()));
               
                BufferedWriter bufOut=
                        new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
               
                String line=null;
                while((line=bufIn.readLine())!=null)
                {
                         System.out.println(line);
                        bufOut.write(line.toUpperCase());
                        bufOut.newLine();
                        bufOut.flush();
                }
                s.close();
                ss.close();
        }
}

先上代码,这代码没错的,可以正常运行。
这段代码的作用是
客户端读取键盘录入的英文字符串,传到服务端转成大写字符返回来打印在控制台上。
然后我想问的问题是,服务端读取数据转换成大写返回给客户端后。不是执行s.close()关闭Soket流   和ss.close()关闭服务端了么。
为什么实际上是返回给客户端后继续等待接受客户端的数据。

作者: 君嘘    时间: 2015-4-10 23:11
噗 楼主连续一个月每天看七八个小时的视频,脑子有点抽风了。。。居然问这么蠢的问题,
因为readLine在等待读取数据啊!!!为何楼主这么蠢。
读取到空才跳出循环啊!!!既然已经读取到数据,执行完动作之后当然又去执行readLine(),没有数据就等待啊。
此贴终结,不用再回复了。楼主表示要去吃药了。。。楼主明天要休息一天,果然还是太累了。
作者: sisel    时间: 2015-4-10 23:15
System.in控制台输入需要你CTRL+c发送结束符,,感觉楼主萌萌哒
作者: 君嘘    时间: 2015-4-10 23:29
sisel 发表于 2015-4-10 23:15
System.in控制台输入需要你CTRL+c发送结束符,,感觉楼主萌萌哒

不是啊。。。是readLine的原因,read()有线程等待机制。。。
作者: sisel    时间: 2015-4-10 23:33
我的意思是 你ctrl+c之后 system.in会接受到结束符,然后readLind()==null了
就跳出来啦






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