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 blocke.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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
最后,总结两点:
一、readLine()方法,需要明确换行符或者结束符,信息需要flush()才能接受到,增加了两端的信息输入(多输入换行符,并且这个符号不同系统是不一样的)
二,任何流进行写入完成后请调用flush()方法推送下。 以确保正确性
当然bufferedReader在操作字符的时候有很多更直观的接口以供调用,使用过程中需仔细注意
转载于:https://www.cnblogs.com/xignzou/p/3202346.html
java编写socket使用bufferedReader.readLine()问题研究相关推荐
- flex socket java_使用Java编写Socket服务器,并且与Flex通信(二)
通过对第一个例子的学习,已经对Socket有了一个比较清晰的认识. 不过第一个例子有一个问题,就是只能有一个客户端调用,下面我们把第一个例子的代码做一个改进,改成多客户端调用的. Java服务端代码T ...
- winsock使用java编写_利用Socket进行Java网络编程(一)
利用Socket进行Java网络编程(一) 考试吧(Exam8.com) 2003-03-04 08:00:00 评论(0)条 作者: 郗旻 Socket是网络上运行的两个程序间双向通讯的一端,它既可 ...
- JAVA编写的使用Socket模拟Http的GET操作
JAVA编写的使用Socket模拟Http的GET操作,看后就很容易理解Web浏览器的原理了. import java.io.BufferedReader; import java.io.InputS ...
- java之socket的OOBInline和UrgentData和发送心跳包研究
UrgentData可以理解为紧急发送数据方式,如果我们客户端先用write方法写入数据,再用UrgentData发送数据,再去执行flush操作,我们可以得到服务端先打印UrgentData发送的数 ...
- JAVA编写的一个简单的Socket实现的HTTP响应服务器
JAVA编写的一个简单的Socket实现的HTTP响应服务器,看后就很容易理解Web服务器的原理了. package test.io;import java.net.*; import java.io ...
- 【Java】Socket网络编程实现内网穿透、端口映射转发、内网穿透上网工具的编写,设置IP白名单防火墙
这里写目录标题 简介 更新 一.背景 1.1 情景假设 1.2 想要达到的目的 1.3 局限 1.3 解决方案一(路由器NAT) 1.4 解决方案二(云服务器转发) 二.方案介绍 2.1 方案简介 2 ...
- java socket 银行,银行前置机程序(通信部分socket,java编写 )
2009年10月31日 星期六 15:32 package Client; import java.io.IOException; import java.io.InputStream; import ...
- Java 网络 socket 编程
使用套接字实现基于 TCP 协议的服务器和客户机程序 依据 TCP 协议,在 C/S 架构的通讯过程中,客户端和服务器的 Socket 动作如下: 客户端: 1.用服务器的 IP 地址和端口号实例化 ...
- java使用Socket类接收和发送数据
java使用Socket类接收和发送数据 网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接 ...
最新文章
- 深度学习原理—代码分析线性分类与神经网络分类的区别
- Jtest 使用教程之代码标准违例修正与标准规则说明书访问
- excel相乘后求和_Excel求和只会sum函数就out了,这五个求和公式一个比一个强
- Hystrix概述(二)
- 【ABAP】Native SQL
- java的静态变量怎么赋值_java static变量可以赋值吗?
- ITK:创建前向差异内核
- nginx日志分析脚本
- 二分查找原理非递归与递归实现【转载】
- 关于gcc -o 的使用问题
- (转)shiro权限框架详解06-shiro与web项目整合(下)
- 被李小龙女儿起诉侵权后,真功夫态度强硬:不寻求和解,无更换商标计划
- centos6 安装和配置PHP 7.0
- 第3章 动态规划 矩阵连乘问题
- php生成一个500错误_Hyperf 发布 v2.0.1 版本 | 企业级的 PHP 微服务云原生协程框架...
- 使用java代码画一棵圣诞树
- 官宣 .NET RC 2
- 《大学》修身、齐家、治国、平天下
- Android 实现自定义宽高比的ImageView
- K8S中的pod、services、容器的概念和区别
热门文章
- 深入“肠-脑”神经高速通道,揭开“第六感觉”面纱
- 推荐|5种商业AI产品的技术架构设计!
- 漫画:产品经理的这些“谎言”,你一定中招过!!!
- 程序人生系列谈:《程序员》带给我的启发故事
- 漫画 | 如果面试时大家都说真话......
- 大厂 CEO 一年薪酬拿多少?
- 百度要造什么车?汽车依然逃不出 BAT 的手掌心 | 撩车
- React 服务端渲染方案完美的解决方案
- 从Promise来看JavaScript中的Event Loop、Tasks和Microtasks
- Js 拦截全局ajax请求