不写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()问题研究相关推荐

  1. flex socket java_使用Java编写Socket服务器,并且与Flex通信(二)

    通过对第一个例子的学习,已经对Socket有了一个比较清晰的认识. 不过第一个例子有一个问题,就是只能有一个客户端调用,下面我们把第一个例子的代码做一个改进,改成多客户端调用的. Java服务端代码T ...

  2. winsock使用java编写_利用Socket进行Java网络编程(一)

    利用Socket进行Java网络编程(一) 考试吧(Exam8.com) 2003-03-04 08:00:00 评论(0)条 作者: 郗旻 Socket是网络上运行的两个程序间双向通讯的一端,它既可 ...

  3. JAVA编写的使用Socket模拟Http的GET操作

    JAVA编写的使用Socket模拟Http的GET操作,看后就很容易理解Web浏览器的原理了. import java.io.BufferedReader; import java.io.InputS ...

  4. java之socket的OOBInline和UrgentData和发送心跳包研究

    UrgentData可以理解为紧急发送数据方式,如果我们客户端先用write方法写入数据,再用UrgentData发送数据,再去执行flush操作,我们可以得到服务端先打印UrgentData发送的数 ...

  5. JAVA编写的一个简单的Socket实现的HTTP响应服务器

    JAVA编写的一个简单的Socket实现的HTTP响应服务器,看后就很容易理解Web服务器的原理了. package test.io;import java.net.*; import java.io ...

  6. 【Java】Socket网络编程实现内网穿透、端口映射转发、内网穿透上网工具的编写,设置IP白名单防火墙

    这里写目录标题 简介 更新 一.背景 1.1 情景假设 1.2 想要达到的目的 1.3 局限 1.3 解决方案一(路由器NAT) 1.4 解决方案二(云服务器转发) 二.方案介绍 2.1 方案简介 2 ...

  7. java socket 银行,银行前置机程序(通信部分socket,java编写 )

    2009年10月31日 星期六 15:32 package Client; import java.io.IOException; import java.io.InputStream; import ...

  8. Java 网络 socket 编程

    使用套接字实现基于 TCP 协议的服务器和客户机程序 依据 TCP 协议,在 C/S 架构的通讯过程中,客户端和服务器的 Socket 动作如下: 客户端: 1.用服务器的 IP 地址和端口号实例化 ...

  9. java使用Socket类接收和发送数据

    java使用Socket类接收和发送数据 网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接 ...

最新文章

  1. 深度学习原理—代码分析线性分类与神经网络分类的区别
  2. Jtest 使用教程之代码标准违例修正与标准规则说明书访问
  3. excel相乘后求和_Excel求和只会sum函数就out了,这五个求和公式一个比一个强
  4. Hystrix概述(二)
  5. 【ABAP】Native SQL
  6. java的静态变量怎么赋值_java static变量可以赋值吗?
  7. ITK:创建前向差异内核
  8. nginx日志分析脚本
  9. 二分查找原理非递归与递归实现【转载】
  10. 关于gcc -o 的使用问题
  11. (转)shiro权限框架详解06-shiro与web项目整合(下)
  12. 被李小龙女儿起诉侵权后,真功夫态度强硬:不寻求和解,无更换商标计划
  13. centos6 安装和配置PHP 7.0
  14. 第3章 动态规划 矩阵连乘问题
  15. php生成一个500错误_Hyperf 发布 v2.0.1 版本 | 企业级的 PHP 微服务云原生协程框架...
  16. 使用java代码画一棵圣诞树
  17. 官宣 .NET RC 2
  18. 《大学》修身、齐家、治国、平天下
  19. Android 实现自定义宽高比的ImageView
  20. K8S中的pod、services、容器的概念和区别

热门文章

  1. 深入“肠-脑”神经高速通道,揭开“第六感觉”面纱
  2. 推荐|5种商业AI产品的技术架构设计!
  3. 漫画:产品经理的这些“谎言”,你一定中招过!!!
  4. 程序人生系列谈:《程序员》带给我的启发故事
  5. 漫画 | 如果面试时大家都说真话......
  6. 大厂 CEO 一年薪酬拿多少?
  7. 百度要造什么车?汽车依然逃不出 BAT 的手掌心 | 撩车
  8. React 服务端渲染方案完美的解决方案
  9. 从Promise来看JavaScript中的Event Loop、Tasks和Microtasks
  10. Js 拦截全局ajax请求