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
本文出自 无忧之路 - 博客园