美文网首页
2021-09-27 网络编程(TCP练习)

2021-09-27 网络编程(TCP练习)

作者: Denholm | 来源:发表于2021-10-09 15:48 被阅读0次

    需求:建立一个文本转换服务器,客户端可以给服务端发送文件,服务端会将文本转换成大写再返回给客户端,并且客户端可以不断地进行文本转换,当客户端输入“over”时,转换结束。
    分析:客户端,既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考:
    源:键盘录入
    目的:网络设置
    网络输出流,而且操作的是文本数据,可以选择字符流
    步骤:
    1.建立服务
    2.获取键盘录入
    3.将数据发送给服务器
    4.获取服务器返回的大写数据
    5.结束,关闭资源

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    
    public class TransClient {
    
        public static void main(String[] args) throws Exception {
            Socket socket = new Socket("192.168.1.6", 10005);
            // 定义读取键盘的流对象
            BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
            // 定义目的,将数据写入到Socket输出流,发给服务端
            BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            // 定义一个Socket读取流,读取服务端返回的大写信息
            BufferedReader bufIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line;
            while ((line = bufr.readLine()) != null) {
                if ("over".equals(line)) {
                    break;
                }
                bufw.write(line);
                bufw.newLine();
                bufw.flush();
                System.out.println("server:" + bufIn.readLine());
            }
            bufr.close();
            socket.close();
        }
    
    }
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TransServer {
    
        public static void main(String[] args) throws Exception {
            ServerSocket server = new ServerSocket(10005);
            Socket accept = server.accept();
            System.out.println(server.getInetAddress().getHostAddress() + "...connected");
            // 源:读取Socket读取流中的数据
            BufferedReader bufr = new BufferedReader(new InputStreamReader(accept.getInputStream()));
            // 目的:Socket输出流,将大写数据写入到Socket输出流,并发送给客户端
            BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
            String line;
            while ((line = bufr.readLine()) != null) {
                System.out.println(line);
                bufw.write(line.toUpperCase());
                bufw.newLine();
                bufw.flush();
            }
            accept.close();
            server.close();
        }
    
    }
    

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

    import java.io.*;
    import java.net.Socket;
    
    public class TransClient {
    
        public static void main(String[] args) throws Exception {
            Socket socket = new Socket("192.168.1.6", 10005);
            // 定义读取键盘的流对象
            BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            // 定义一个Socket读取流,读取服务端返回的大写信息
            BufferedReader bufIn = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));
            String line;
            while ((line = bufr.readLine()) != null) {
                if ("over".equals(line)) {
                    break;
                }
                out.println(line);
                System.out.println("server:" + bufIn.readLine());
            }
            bufr.close();
            socket.close();
        }
    
    }
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TransServer {
    
        public static void main(String[] args) throws Exception {
            ServerSocket server = new ServerSocket(10005);
            Socket accept = server.accept();
            System.out.println(server.getInetAddress().getHostAddress() + "...connected");
            // 源:读取Socket读取流中的数据
            BufferedReader bufr = new BufferedReader(
                    new InputStreamReader(accept.getInputStream()));
            // 目的:Socket输出流,将大写数据写入到Socket输出流,并发送给客户端
            PrintWriter out = new PrintWriter(accept.getOutputStream(), true);
            String line;
            while ((line = bufr.readLine()) != null) {
                System.out.println(line);
                out.println(line.toUpperCase());
            }
            accept.close();
            server.close();
        }
    
    }
    

    相关文章

      网友评论

          本文标题:2021-09-27 网络编程(TCP练习)

          本文链接:https://www.haomeiwen.com/subject/xtrknltx.html