BufferedRead @ BuferedWrite 在Socket中的问题

来源:互联网 发布:乔丹生涯数据场均 编辑:程序博客网 时间:2024/06/06 18:39

研究Socket编程的时候,想提高传输的效率因此次采用BufferedWrite 与BufferedReader ,完成客户端与服务器端的编程服务器端用。

客户端用Eclipse 中使用ServerSocket实现,客户端使用Android ,

核心代码如下:

serverSocket  = new ServerSocket(port); //绑定端口号
Socket socket = serverSocket.accept();//监听接收连接
System.out.println("客户端连接成功!!!!!!!");
//获取输入流并将其包装成具有缓冲作用的包装流
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//输出流
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//读取接收的信息
String in_info = in.readLine()+System.getProperty("line.separator");
System.out.println(in_info);
String out_info = "Goodbye from port "+port;
out.write(out_info+"\n");
out.flush();
socket.close();

测试时能连接成功,但是无法接受数据,

上面的java Socket通信用到了BufferedReader的readLine()方法和BufferedWriter的write()方法。

注意readLine()方法,通过查看JDK中关于此方法的注释可知,它是读取一行数据,这行数据的末尾必须有换行符标识符说明到此为止是一行。不然readLine()方法无法顺利读取。

所以在服务器端或客户端进行输出的时候必须输出换行标识(\n),让对方可以顺利读取一行。因此可以这样写writer.write("hello world\n")。为了更好地使用java的跨平台特性,BufferedWriter提供了一个newLine()方法,该方法就是专门输出一个换行符。所以也可以这样写writer.write("hello world");writer.newLine();

另外既然是BufferedWriter,自然用到了缓冲,当你输出的字符长度不超过缓冲区时,可能不会被输出,这时候程序也无法正常运行。所以要用writer.flush();刷新缓冲区。也就是说writer.write("我接收到你的数据:"+input);writer.newLine();writer.flush();必须一起使用,它们总是同时出现,因此你可以自定义一个方法,包含这三个方法。

public void writeLine(String msg){

writer.write(msg);
writer.newLine();
writer.flush();

}


0 0