关于TCP字符流编程demo的一个小问题

113 阅读1分钟

最近在学习java基础网络编程的时候,跟着教程写了一个demo,是关于TCP字符流的。

程序的主要作用是客户端和服务端交替发送一条消息并接收

先看一下运行抛出异常的代码

首先是客户端的代码

public class SocketTCPClient03 {
    public static void main(String[] args) throws IOException {
        // 字符流
        final Socket socket = new Socket(InetAddress.getLocalHost(), 9999);

        final OutputStream outputStream = socket.getOutputStream();

        // 使用字符流, 这里需要使用转换流
        final BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello,server 字符流");
        bufferedWriter.newLine(); // 插入一个换行符表示写入结束, 这里要求对方使用readLine()读取
        bufferedWriter.close(); 

        // 读取来自服务端的数据
        final InputStream inputStream = socket.getInputStream();
        final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

        System.out.println(bufferedReader.readLine());

        bufferedReader.close();
        bufferedWriter.close();
        socket.close();

    }
}

客户端在给服务端写入数据并告知数据传送完后,使用bufferWriter.close()关闭了流。 此时当运行到下一行代码时,程序抛出异常,异常显示socket已经被关闭

下面看一下服务端的代码,跟客户端的代码逻辑一样

public class SocketTCPServer03 {
    public static void main(String[] args) throws IOException {
        // 字符流
        final ServerSocket serverSocket = new ServerSocket(9999);
        final Socket socket = serverSocket.accept();

        // 读取客户端数据
        final InputStream inputStream = socket.getInputStream();
        // 转换成字符输入流
        final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

        System.out.println(bufferedReader.readLine());

        final OutputStream outputStream = socket.getOutputStream();
        final BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello, client 字符流");
        bufferedWriter.newLine();// 写入结束


        bufferedWriter.close();
        bufferedReader.close();
        socket.close();
        serverSocket.close();

    }
}

由于服务端是先读取在给数据通道写入数据,所以在最后直接关闭了写入流。

想问以下各位大佬客户端抛出的异常是为什么? 客户端代码里flush换成close为什么会出现问题?