當接收的類使用的是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