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("你好,我是客戶端!\n");

或者:

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

使用bufferedWriter的newLine()方法。
記得發送過去的時候要調用flush()刷新。

另外,客戶端程序的正常調用socket.close()之后,服務器的readLine會讀取到null,由此判斷客戶端斷開連接。如果直接停止客戶端程序,服務器會得到異常:Connection reset


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM