readLine方法的简单练习,回答2016-04-27 的帖子的问题

来源:互联网 发布:陈田村拆车件淘宝店 编辑:程序博客网 时间:2024/04/30 13:29

需求:建立一个文本转换服务器。
客户端给服务端发送文本,服务端会将文本转成大写,再返回给客户端,
 而且客户端可以不断的进行文本转换,当客户端输入over是,转换结束。


public class TCPDemo02 {//客户端

    public static void main(String[] args) {
        try {
            Socket socket=new Socket("172.60.20.120",10005);
//定义读取键盘数据的流对象
            BufferedReader bufr=
new BufferedReader(new InputStreamReader(System.in));
//定义目的。将数据写入到socket输出流,发给服务端
           BufferedWriter bufout=
new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//定义一个socket读取流,读取服务端返回的大写信息
            BufferedReader bufIn=
new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line=null;

            while ((line=bufr.readLine())!=null) {

//4.这是readlIne方法的解读,若服务器端程序不写newLine方法,则它在这个方法时,

就会发生阻塞,

                if ("over".equals(line)) {
                    break;
                }
               bufout.write(line);

                bufout.newLine();

//1.必须要加,如果不加newline方法,那么不会写入换行符,同时服务器端不会读到换行符


                bufout.flush();//记得刷新

                String str=bufIn.readLine();
                System.out.println("server"+str);
            }
            bufr.close();
            socket.close();//加个-1
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}


public class TCPServerDemo02 {//服务器端
    public static void main(String[] args) {
        try {
            ServerSocket server=new ServerSocket(10005);
            Socket socket=server.accept();
            String ip=socket.getInetAddress().getHostAddress();
            System.out.println(ip+"-----connected");
            
//读取socket读取流中的数据。            
            BufferedReader bufIn=
new BufferedReader(new InputStreamReader(socket.getInputStream()));

//目的。socket输出流。将大写数据写入到socket输出流,并发送给客户端。
            BufferedWriter bufOut=
new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            String line=null;
            while ((line=bufIn.readLine())!=null) {

//2.Reads a line of text.  A line is considered to be terminated by any one
of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed

immediately by a linefeed.

这时readlIne方法的解读,若客户端程序不写newLine方法,则它在这个方法时,就会

发生阻塞,

               bufOut.write(line.toUpperCase());
                bufOut.newLine();

//3.必须要加,如果不加newline方法,那么jiu不会写入换行符,同时客户端不会读到换行符        

       bufOut.flush();
            }
            
            socket.close();//客户端关掉
            server.close();//服务端关掉
            
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


用这个对象可以代替BufferedWriter对象,

PrintWriter out=new PrintWriter(socket.getOutputStream(),true);

因为这个对象可以使用println方法,相对来说代码会少一些

总结:

该例子出现的问题。
现象:客户端和服务端倒在莫名的等待。
原因:因为客户端和服务端都有阻塞式方法。这些方法没有读到结束标记,那么就一直等待,
从而,导致两端都在等待

虽然帖子晚了几分钟,但是小妞在睡觉之前补上了



0 0
原创粉丝点击