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

Java Socket 使用BufferedWriter和BufferedReader要注意readLine
以及换行标志的发送

时间: 2024-12-28 06:15:24

Java Socket 使用BufferedWriter和BufferedReader要注意readLine 以及换行标志的发送的相关文章

java Socket通信使用BufferedReader和BufferedWriter的注意事项

注意事项:readLine()要求有换行标识,write()要输出换行标识,要调用flush()刷新缓冲区. 以下是取自java socket通信中的一小段代码. BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.get

Java IO6:字符流进阶及BufferedWriter、BufferedReader

原文:http://www.cnblogs.com/xrq730/p/4890052.html 字符流和字节流的区别 public static void main(String[] args) throws Exception{ File file = new File("D:/writer.txt"); Writer out = new FileWriter(file); // 声明一个String类型对象 String str = "Hello World!!!&quo

Java IO4:字符流进阶及BufferedWriter、BufferedReader

字符流和字节流的区别 拿一下上一篇文章的例子: 1 public static void main(String[] args) throws Exception 2 { 3 File file = new File("D:/writer.txt"); 4 Writer out = new FileWriter(file); 5 // 声明一个String类型对象 6 String str = "Hello World!!!"; 7 out.write(str);

JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine

JAVA之旅(二十五)--文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine 我们继续IO上个篇幅讲 一.文本复制 读写都说了,我们来看下其他的操作,我们首先来看复制 复制原理:其实就是将C盘下的文件数据存储到D盘的一个文件中 实现的步骤: 1.在D盘创建一个文件,用于存储文件中的数据 2.定义读取流和文件关联 3.通过不断的读写完成数据的存储 关闭资源 package com.lgl.hel

JAVA Socket超时浅析(转)

套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的“终端”.针对一个特定的连接,每台机器上都有一个“套接字”,可以想象它们之间有一条虚拟的“线缆”.JAVA有两个基于数据流的套接字类:ServerSocket,服务器用它“侦听”进入的连接:Socket,客户端用它初始一次连接.侦听套接字只能接收新的连接请求,不能接收实际的数据包. 套接字是基于TCP/IP实现的,它是用来提供一个访问TCP的服务接口,或者说套接字socket是TCP的应用编程接口API,通过它应用层就

java socket小结

Java socket相对与C来说,封装性更好,所以使用上面比较简洁.服务端方面,需要一个ServerSocket对象,开启监听,利用服务端获取的链接服务端的socket对象,构建输入流和输出流,输入流是InputStream input,向上封装后是InputStreamReader inputreader,InputStreamReader对象向上封装后是BufferedReader对象.BufferedReader对象用来获取客户端发送给服务端的信息,输出流对象是OutputStream

Java Socket 多线程编程,处理百万级的数据并发。

感谢网上的大神分享的代码,然后我根据我们项目的需求,组装成余下代码,基本上大概的框架就是这个模式,需要修改的就是业务数据的传递 ,其他的都是不用修改的. 本着学习他人代码,学会他人分享精神,因此将我花了两天研究的代码分享出来(晚上的时间).希望有大神多多指教我这个编程菜鸟的技术,本菜鸟感激不敬. ServerSocket : import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOExcepti

JAVA Socket 底层是怎样基于TCP/IP 实现的???

首先必须明确:TCP/IP模型中有四层结构:       应用层(Application Layer).传输层(Transport  Layer).网络层(Internet Layer  ).链路层(LinkLayer)  其中Ip协议(Internet Protocol)是位于网络层的,TCP协议时位于传输层的.通过Ip协议可以使可以使两台计算机使用同一种语言,从而允许Internet上连接不同类型的计算机和不同操作系统的网络.Ip协议只保证计算机能够接收和发送分组数据. 当计算机要和远程的计

java socket输入输出中文乱码问题

http://hi.baidu.com/linjk03/item/e2028bfd990c14ea1a111feb 统一了输入输出的编码格式,是不会有乱码问题出现的. 构造Reader或Writer时,指定编码格式. in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8")); out = new BufferedWriter(new OutputStreamWriter(socket.