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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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()关闭服务端了么。
为什么实际上是返回给客户端后继续等待接受客户端的数据。

4 个回复

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

不是啊。。。是readLine的原因,read()有线程等待机制。。。
回复 使用道具 举报
我的意思是 你ctrl+c之后 system.in会接受到结束符,然后readLind()==null了
就跳出来啦

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马