不写java代码好久,临时写个socket通讯竟然失败,郁闷之下仔细研究了下。

客户端使用BufferedReader来读取数据,在while中调用BufferedReader.readLine()函数,结果程序运行起来之后一直死等,就是不输出想要的结果。

google发现 readLine()方式是读行的,所以只有遇到换行符或者流结束的时候才会得到结果,在window系统下使用"\r\n"代替换行符,验证ok。

即在我们一般的服务端输出信息

  1. printWriter.write("news");
  2.  
  3. //输入换行符并发送到客户端
  4.  
  5. printWriter.write("\r\n");
  6.  
  7. printWriter.flush();

下面附上几个简单源码:小弟这里是用来解决flex调用socket垮与文件许可的,所以下面内容也是以此为例,服务需支持多次调用,客户端接收到跨域文件后则关闭

首先是最直接的,不使用BufferedReader(),个人感觉这个更简单清晰些

服务端,客户端都使用DataInputStream; DataOutputStream();

服务代码:

  1. public class Server {
  2. public static void main(String args[]){
  3. try {
  4. DataInputStream din;
  5. DataOutputStream dout;
  6.  
  7. ServerSocket server = new ServerSocket(4444);
  8.  
  9. while(true){
  10. Socket client = server.accept();
  11. din = new DataInputStream(client.getInputStream());
  12. dout = new DataOutputStream(client.getOutputStream());
  13.  
  14. String s;
  15. if((s = din.readUTF()) != null){
  16. System.out.println(s);
  17. }
  18.  
  19. if(s.equals("<policy-file-request/>")){
  20. String msg = "<?xml version=\"1.0\"?>" + "<cross-domain-policy>"
  21. + "<site-control permitted-cross-domain-policies=\"all\"/>"
  22. + "<allow-access-from domain=\"*\" to-ports=\"*\" />"
  23. + "</cross-domain-policy>";
  24. dout.writeUTF(msg);
  25. }
  26. din.close();
  27. dout.close();
  28. client.close();
  29. }
  30.  
  31. } catch (IOException e) {
  32. // TODO Auto-generated catch block
  33. e.printStackTrace();
  34. }
  35.  
  36. }
  37. }

客户端:

  1. public class Client {
  2.  
  3. public static void main(String args[]){
  4.  
  5. DataInputStream din;
  6. DataOutputStream dout;
  7. try {
  8. Socket client = new Socket("127.0.0.1", 2000);
  9.  
  10. din = new DataInputStream(client.getInputStream());
  11. dout = new DataOutputStream(client.getOutputStream());
  12. dout.writeUTF("<policy-file-request/>");
  13.  
  14. String s = null;
  15. if((s=din.readUTF()) != null){
  16. System.out.println(s);
  17. }
  18. din.close();
  19. dout.close();
  20. client.close();
  21.  
  22. } catch (UnknownHostException e) {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. } catch (IOException e) {
  26. // TODO Auto-generated catch block
  27. e.printStackTrace();
  28. }
  29.  
  30. }
  31. }

更换客户端接收为BufferedReader,使用readLine()方法。如果继续使用上面的服务,那么依然是没有错的....因为上面的服务段在信息输出之后理科调用了dout.colse方法。正如我们开始说的,当流结束的时候readLine()方法也能读取到结果。  如果是想实现一个客户端和服务端保持连接一直交互通讯的功能,那么请在上面的信息输入完成后添加如下代码

  1. dout.writeUTF(msg);//补充
  2. //因为在客户端使用bufferedReader.readLine()在读取,这里必须输入换行符,
  3. //并且调用fluesh(),方法。否则客户端将陷入死等状态
  4. dout.writeUTF("\r\n");
  5. dout.flush();

此时客户端代码如下:

  1. import java.io.BufferedReader;
  2. import java.io.DataInputStream;
  3. import java.io.DataOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.io.OutputStream;
  8. import java.io.PrintWriter;
  9. import java.net.Socket;
  10. import java.net.UnknownHostException;
  11.  
  12. public class Client {
  13.  
  14. public static void main(String args[]){
  15.  
  16. DataOutputStream dout;
  17. BufferedReader br;
  18. PrintWriter out;
  19. try {
  20. Socket client = new Socket("127.0.0.1", 4444);
  21.  
  22. br = new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));
  23. dout = new DataOutputStream(client.getOutputStream());
  24. dout.writeUTF("<policy-file-request/>");
  25.  
  26. String s = null;
  27. while(true){
  28. s = br.readLine();
  29. if(s != null){
  30. System.out.println(s);
  31. break;
  32. }
  33. }
  34.  
  35. br.close();
  36. dout.close();
  37. client.close();
  38.  
  39. } catch (UnknownHostException e) {
  40. // TODO Auto-generated catch block
  41. e.printStackTrace();
  42. } catch (IOException e) {
  43. // TODO Auto-generated catch block
  44. e.printStackTrace();
  45. }
  46.  
  47. }
  48. }

最后,总结两点:

一、readLine()方法,需要明确换行符或者结束符,信息需要flush()才能接受到,增加了两端的信息输入(多输入换行符,并且这个符号不同系统是不一样的)

二,任何流进行写入完成后请调用flush()方法推送下。  以确保正确性

当然bufferedReader在操作字符的时候有很多更直观的接口以供调用,使用过程中需仔细注意

java编写socket使用bufferedReader.readLine()问题研究的更多相关文章

  1. Socket中BufferedReader.readLine()的阻塞特性导致的数据无法多次发送的问题

    https://blog.csdn.net/shenpibaipao/article/details/70236657

  2. Flex通信-与Java实现Socket通信实例

    Flex通信-与Java实现Socket通信实例  转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...

  3. Java:bufferedReader.readLine()读取文件换行问题

    代码实现读取到的内容正常换行,并将内容复制到系统剪贴板当中去. public static void ReadAlart() { try { String encoding="utf-8&q ...

  4. 【Android编程】Java利用Socket类编写Metasploit安卓载荷辅助模块

    /作者:Kali_MG1937 CSDN博客:ALDYS4 QQ:3496925334/ 注意!此文章被作者标记到 黑历史 专栏中,这意味着本篇文章可能存在 质量低下,流水账文,笔法低质 的问题 为了 ...

  5. 简单通过java的socket&serversocket以及多线程技术实现多客户端的数据的传输,并将数据写入hbase中

    业务需求说明,由于公司数据中心处于刚开始部署的阶段,这需要涉及其它部分将数据全部汇总到数据中心,这实现的方式是同上传json文件,通过采用socket&serversocket实现传输. 其中 ...

  6. java编写service详细笔记 - centos7.2实战笔记(windows类似就不在重复了)

    java编写service详细笔记 - centos7.2实战笔记(windows类似就不在重复了)  目标效果(命令行启动服务): service xxxxd start #启动服务  servic ...

  7. loadrunner 编写socket脚本实例(附服务端实现)

    一.socket背景知识 这个咱就不废话了,网上一搜一大堆 二.本实例实现的功能 服务端接收客户端发送的字符串,并返回"5678succ"共8个字符 三.服务端实现(java代码) ...

  8. java基于socket公共聊天室的实现

    项目:一个公共聊天室功能的实现,实现了登录聊天,保存聊天记录等功能. 一.实现代码 1.客户端 ChatClient.java import java.io.BufferedReader; impor ...

  9. JAVA之Socket编程

    网上对Socket的诠释很多,也很全,在这里我就不多说了,总之,现在的网络处处都在使用Socket.本帖是一个Socket的例子,用来模拟一个简单的登录系统,只有核心代码,访问数据库.输入神马的统统没 ...

随机推荐

  1. Python的工具包[0] -> numpy科学计算 -> numpy 库及使用总结

    NumPy 目录 关于 numpy numpy 库 numpy 基本操作 numpy 复制操作 numpy 计算 numpy 常用函数 1 关于numpy / About numpy NumPy系统是 ...

  2. ACdream1032(树形DP)

    ACdream1032 题意 给出一棵树,每个节点有权值,问由 \(1\) ~ \(n\) 个节点组成的树块的权值和的最小值. 分析 首先发现 \(n\) 很小,那么我们可以开一个二维数组 \(dp[ ...

  3. 分层图【p4822】[BJWC2012]冻结

    Description "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于卡片之中„„" ...

  4. Strobogrammatic Number II -- LeetCode

    A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...

  5. Python数据结构:序列(列表[]、元组())与映射(字典{})语法总结

    一.概述:Python中两种基本的数据结构是序列和映射,序列包含:可变的列表和不可变的元组:而当序列不够用时就出现了映射:字典.列表中的元素是可以变化的,元组里面的元素一旦初始化后就不可更改.列表和元 ...

  6. UBIFS介绍 - MTD网站

    转:http://blog.csdn.net/kickxxx/article/details/6583463 目录(?)[-] Big red note Overview Scalabity Writ ...

  7. zookeeper启动错误 ---- Unable to load database on disk

    zk启动报错 解决办法,进入zkdata目录删除version-2下面的所有文件 参考: https://issues.apache.org/jira/browse/ZOOKEEPER-1546 [h ...

  8. nginx静态资源配置

    解决EE工程中静态文件显示问题 在工程中本地测试没有问题,发现使用nginx配置了路径的页面,会获取不到相应页面的静态文件问题 静态文件的路径类似为: http://localhost:8080/sa ...

  9. Linux取消挂载,删除用户及其目录

    取消挂载 取消挂载命令: umount /dev/sdb 命令umount 文件系统/挂载点 umount /dev/sdb 例如:umount /dev/sdb即可将sdb1取消挂载. 如果出现de ...

  10. idea 热部署