Java Socket 使用BufferedWriter和BufferedReader要注意readLine 以及换行标志的发送

当接收的类使用的是BufferedReader,发送的类是BufferedWriter的时候,要注意发送的一行要有换行标识符。

请看下面一个例子,服务器接收不到客户端的信息。

服务器:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by 290248126 on 14-5-10.
 */
public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(8088);
        Socket socket = serverSocket.accept();
        System.out.println("一个客户端连接了");

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println("客户端:" + bufferedReader.readLine());

        Thread.sleep(100000);
        socket.close();
        serverSocket.close();
    }
}

客户端:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by 290248126 on 14-5-10.
 */
public class Client {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("localhost",8088);
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bufferedWriter.write("你好,我是客户端!");
        bufferedWriter.flush();
        System.out.println("我们已经发送出去");
        Thread.sleep(100000);
        socket.close();
    }
}

在上面的客户端中,write的时候并没有发送换行标识符,因此服务器在接收的时候,readLine是读取一行,没遇到换行就读取不出来。

因此服务器接收不到客户端的信息。

解决方案方法如下:

只需要修改客户端部分:

bufferedWriter.write("你好,我是客户端!
");

或者:

bufferedWriter.write("你好,我是客户端!");
bufferedWriter.newLine();

使用bufferedWriter的newLine()方法。
记得发送过去的时候要调用flush()刷新。

另外,客户端程序的正常调用socket.close()之后,服务器的readLine会读取到null,由此判断客户端断开连接。如果直接停止客户端程序,服务器会得到异常:Connection reset

原文地址:https://www.cnblogs.com/wuyou/p/3720626.html