Socket编程使用IO流需要注意的地方

在Socket编程中,我们经常会创建Socket连接后。获取InputStream和OutputStream,并进一步包装以便方便的进行数据的读取或写入操作。
但是,如果流使用的不对,就可能会产生无法读取到数据的情况。

下面是使用BufferedWriter和PrintWriter需要注意的地方。

1.使用BufferedReader和BufferedWriter

如果使用BufferedReader和BufferedWriter来一次读取或写入一行数据,必须要加\n,代表一行结束。否则BufferedReader读取不到数据。

BufferedReader br = null;
BufferedWriter pw = null;
try {
    br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    pw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    while (true) {
        String input = br.readLine();
        if (null == input) {
            break;
        }
        System.out.println("接收到客户端请求:" + input);
        if ("Server Time".equalsIgnoreCase(input)) {
            // 注意:这里使用了BufferedWriter,必须要加\n,否则对方的BufferedReader的readLine()获取不到数据。
            pw.write((new Date()).toString()+"\n");
            pw.flush();
        }
    }
} catch (IOException e) {
    System.out.println("ip:" + socket.getInetAddress().getHostAddress() + " I/O异常");
}

2.使用BufferedReader和PrintWriter

仍然是使用BufferedReader一次读取一行数据,写数据用PrintWriter的println()方法。同时在构造PrintWriter时设置autoFlush=true。

socket = new Socket(host,port);
in = socket.getInputStream();
out = socket.getOutputStream();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(out),true); // 这里设置autoFlush=true
BufferedReader br = new BufferedReader(new InputStreamReader(in));
System.out.println("请求服务器时间");
pw.println("Server Time"); // 使用println写数据,不要使用write()
String response = br.readLine();
System.out.println("response:" + response);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值