当接收的类使用的是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
Java Socket 使用BufferedWriter和BufferedReader要注意readLine
以及换行标志的发送