java编写socket使用bufferedReader.readLine()问题研究
不写java代码好久,临时写个socket通讯竟然失败,郁闷之下仔细研究了下。
客户端使用BufferedReader来读取数据,在while中调用BufferedReader.readLine()函数,结果程序运行起来之后一直死等,就是不输出想要的结果。
google发现 readLine()方式是读行的,所以只有遇到换行符或者流结束的时候才会得到结果,在window系统下使用"\r\n"代替换行符,验证ok。
即在我们一般的服务端输出信息
- printWriter.write("news");
- //输入换行符并发送到客户端
- printWriter.write("\r\n");
- printWriter.flush();
下面附上几个简单源码:小弟这里是用来解决flex调用socket垮与文件许可的,所以下面内容也是以此为例,服务需支持多次调用,客户端接收到跨域文件后则关闭
首先是最直接的,不使用BufferedReader(),个人感觉这个更简单清晰些
服务端,客户端都使用DataInputStream; DataOutputStream();
服务代码:
- public class Server {
- public static void main(String args[]){
- try {
- DataInputStream din;
- DataOutputStream dout;
- ServerSocket server = new ServerSocket(4444);
- while(true){
- Socket client = server.accept();
- din = new DataInputStream(client.getInputStream());
- dout = new DataOutputStream(client.getOutputStream());
- String s;
- if((s = din.readUTF()) != null){
- System.out.println(s);
- }
- if(s.equals("<policy-file-request/>")){
- String msg = "<?xml version=\"1.0\"?>" + "<cross-domain-policy>"
- + "<site-control permitted-cross-domain-policies=\"all\"/>"
- + "<allow-access-from domain=\"*\" to-ports=\"*\" />"
- + "</cross-domain-policy>";
- dout.writeUTF(msg);
- }
- din.close();
- dout.close();
- client.close();
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
客户端:
- public class Client {
- public static void main(String args[]){
- DataInputStream din;
- DataOutputStream dout;
- try {
- Socket client = new Socket("127.0.0.1", 2000);
- din = new DataInputStream(client.getInputStream());
- dout = new DataOutputStream(client.getOutputStream());
- dout.writeUTF("<policy-file-request/>");
- String s = null;
- if((s=din.readUTF()) != null){
- System.out.println(s);
- }
- din.close();
- dout.close();
- client.close();
- } catch (UnknownHostException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
更换客户端接收为BufferedReader,使用readLine()方法。如果继续使用上面的服务,那么依然是没有错的....因为上面的服务段在信息输出之后理科调用了dout.colse方法。正如我们开始说的,当流结束的时候readLine()方法也能读取到结果。 如果是想实现一个客户端和服务端保持连接一直交互通讯的功能,那么请在上面的信息输入完成后添加如下代码
- dout.writeUTF(msg);//补充
- //因为在客户端使用bufferedReader.readLine()在读取,这里必须输入换行符,
- //并且调用fluesh(),方法。否则客户端将陷入死等状态
- dout.writeUTF("\r\n");
- dout.flush();
此时客户端代码如下:
- import java.io.BufferedReader;
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.io.PrintWriter;
- import java.net.Socket;
- import java.net.UnknownHostException;
- public class Client {
- public static void main(String args[]){
- DataOutputStream dout;
- BufferedReader br;
- PrintWriter out;
- try {
- Socket client = new Socket("127.0.0.1", 4444);
- br = new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));
- dout = new DataOutputStream(client.getOutputStream());
- dout.writeUTF("<policy-file-request/>");
- String s = null;
- while(true){
- s = br.readLine();
- if(s != null){
- System.out.println(s);
- break;
- }
- }
- br.close();
- dout.close();
- client.close();
- } catch (UnknownHostException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
最后,总结两点:
一、readLine()方法,需要明确换行符或者结束符,信息需要flush()才能接受到,增加了两端的信息输入(多输入换行符,并且这个符号不同系统是不一样的)
二,任何流进行写入完成后请调用flush()方法推送下。 以确保正确性
当然bufferedReader在操作字符的时候有很多更直观的接口以供调用,使用过程中需仔细注意
java编写socket使用bufferedReader.readLine()问题研究的更多相关文章
- Socket中BufferedReader.readLine()的阻塞特性导致的数据无法多次发送的问题
https://blog.csdn.net/shenpibaipao/article/details/70236657
- Flex通信-与Java实现Socket通信实例
Flex通信-与Java实现Socket通信实例 转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...
- Java:bufferedReader.readLine()读取文件换行问题
代码实现读取到的内容正常换行,并将内容复制到系统剪贴板当中去. public static void ReadAlart() { try { String encoding="utf-8&q ...
- 【Android编程】Java利用Socket类编写Metasploit安卓载荷辅助模块
/作者:Kali_MG1937 CSDN博客:ALDYS4 QQ:3496925334/ 注意!此文章被作者标记到 黑历史 专栏中,这意味着本篇文章可能存在 质量低下,流水账文,笔法低质 的问题 为了 ...
- 简单通过java的socket&serversocket以及多线程技术实现多客户端的数据的传输,并将数据写入hbase中
业务需求说明,由于公司数据中心处于刚开始部署的阶段,这需要涉及其它部分将数据全部汇总到数据中心,这实现的方式是同上传json文件,通过采用socket&serversocket实现传输. 其中 ...
- java编写service详细笔记 - centos7.2实战笔记(windows类似就不在重复了)
java编写service详细笔记 - centos7.2实战笔记(windows类似就不在重复了) 目标效果(命令行启动服务): service xxxxd start #启动服务 servic ...
- loadrunner 编写socket脚本实例(附服务端实现)
一.socket背景知识 这个咱就不废话了,网上一搜一大堆 二.本实例实现的功能 服务端接收客户端发送的字符串,并返回"5678succ"共8个字符 三.服务端实现(java代码) ...
- java基于socket公共聊天室的实现
项目:一个公共聊天室功能的实现,实现了登录聊天,保存聊天记录等功能. 一.实现代码 1.客户端 ChatClient.java import java.io.BufferedReader; impor ...
- JAVA之Socket编程
网上对Socket的诠释很多,也很全,在这里我就不多说了,总之,现在的网络处处都在使用Socket.本帖是一个Socket的例子,用来模拟一个简单的登录系统,只有核心代码,访问数据库.输入神马的统统没 ...
随机推荐
- Python的工具包[0] -> numpy科学计算 -> numpy 库及使用总结
NumPy 目录 关于 numpy numpy 库 numpy 基本操作 numpy 复制操作 numpy 计算 numpy 常用函数 1 关于numpy / About numpy NumPy系统是 ...
- ACdream1032(树形DP)
ACdream1032 题意 给出一棵树,每个节点有权值,问由 \(1\) ~ \(n\) 个节点组成的树块的权值和的最小值. 分析 首先发现 \(n\) 很小,那么我们可以开一个二维数组 \(dp[ ...
- 分层图【p4822】[BJWC2012]冻结
Description "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于卡片之中„„" ...
- Strobogrammatic Number II -- LeetCode
A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...
- Python数据结构:序列(列表[]、元组())与映射(字典{})语法总结
一.概述:Python中两种基本的数据结构是序列和映射,序列包含:可变的列表和不可变的元组:而当序列不够用时就出现了映射:字典.列表中的元素是可以变化的,元组里面的元素一旦初始化后就不可更改.列表和元 ...
- UBIFS介绍 - MTD网站
转:http://blog.csdn.net/kickxxx/article/details/6583463 目录(?)[-] Big red note Overview Scalabity Writ ...
- zookeeper启动错误 ---- Unable to load database on disk
zk启动报错 解决办法,进入zkdata目录删除version-2下面的所有文件 参考: https://issues.apache.org/jira/browse/ZOOKEEPER-1546 [h ...
- nginx静态资源配置
解决EE工程中静态文件显示问题 在工程中本地测试没有问题,发现使用nginx配置了路径的页面,会获取不到相应页面的静态文件问题 静态文件的路径类似为: http://localhost:8080/sa ...
- Linux取消挂载,删除用户及其目录
取消挂载 取消挂载命令: umount /dev/sdb 命令umount 文件系统/挂载点 umount /dev/sdb 例如:umount /dev/sdb即可将sdb1取消挂载. 如果出现de ...
- idea 热部署