最近在学习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为什么会出现问题?