本篇记录:

1、再谈readLine()方法

  2、什么是真正的长连接

最近又参与了一个socket的项目,又遇到了老生常谈的readLine()问题:对方通过其vb程序向我方socketServer程序发送报文,后天日志查看有read超时的异常。

关于line=readLine()方法,其为一个阻塞方法,遇到\r 、\n、\r\n时会返回此时为止读到的数据,作为“一行”赋值给line变量。而之后除非超时或者发送端关闭输出流,readLine()才会返回null,代表读取结束。也就是说如果不是超时或关闭流,那么readLine()读取完所有行之后仍然会一直阻塞。

下面代码为客户端的发送代码,红字为关键,正是其确保服务器端的readLine()方法结束阻塞。

Socket clientSocket = new Socket(address, port);
LOGGER.debug("网络" + address + ":" + port + "初始化已经完成,服务端已连接!");
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
try {
// 向clientSocket中写入报文
Integer length = msg.toString().length();
String lengthStr = length.toString();
while (lengthStr.length() < 5) {
lengthStr = "0" + lengthStr;
}
System.out.println(lengthStr + msg);
writer.println(lengthStr + msg);
writer.flush();
clientSocket.shutdownOutput();
LOGGER.debug("上送信息:" + lengthStr + msg);
//等待回复
InputStream is = clientSocket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String str = br.readLine();
LOGGER.debug("读取返回信息:" + str);
System.out.println(str);
if (StringUtils.isNotEmpty(str) && str.startsWith("1|")) {
isSucc = true;
}
clientSocket.shutdownInput();
} catch (Exception ex) {
LOGGER.error("上送报文异常", ex);
System.out.println(ex.getMessage());
isSucc = false;
return isSucc;
} finally {
writer.close(); }

在C、VC、VB中也是一样的,因为网络通信底层是相通的:

最后,上述技术方案中实际上是使用TCP socket实现的一种短连接通信:客户端打开socket连接,然后发送报文,关闭输出流,接受服务端返回报文,关闭输入流,关闭连接; 服务端收到客户端socket连接,使用输入流接收上送的报文,处理,使用输出流向客户端发送返回报文。

那么真正的长连接是怎样的呢? 首先,长连接在于不是上述这种打开-发送-接收-返回-关闭的方式,而是在一段长时间内保持连接而不关闭,或者在连接空闲时超时关闭的时候,通过心跳检测机制,发现超时关闭而重新建立连接。与短连接相比,减少了打开-关闭连接的开销。

如何使用socket进行java网络编程(五)的更多相关文章

  1. 如何使用socket进行java网络编程(二)

    通过在如何使用socket进行java网络编程(一)中程序的编写,可以总结出一些常用的java socket编程的范例来. ServerSocket server = new ServerSocket ...

  2. 如何使用socket进行java网络编程(三)

    本篇文章继续记录java网络通讯编程的学习.在本系列笔记的第一篇中曾经记录过一个项目中的程序,当时还处于项目早期,还未进入与第三方公司的联调阶段,笔者只是用java写了一个client程序模拟了一下第 ...

  3. 如何使用socket进行java网络编程(四)

    在上一篇的结尾,提到过用来处理每一个服务端accept到的socket,我们由原来最开始的单线程改成了多线程去处理,但是对每一个接收到的socket都new一个thread去处理,这样效率太低,我们需 ...

  4. 如何使用socket进行java网络编程(一)

    笔者进来遇到一个项目,一家公司的系统需要在完成自身业务逻辑的同时,接入到某银行的核心系统(这里准确说应该是前置机)进行一系列的账务处理,然后再将账务处理结果返回给该公司系统. 网络通信采用TCP协议. ...

  5. java 网络编程复习(转)

    好久没有看过Java网络编程了,现在刚好公司有机会接触,顺便的拾起以前的东西 参照原博客:http://www.cnblogs.com/linzheng/archive/2011/01/23/1942 ...

  6. Java 网络编程(转)

    一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  7. 关于Java网络编程

    一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  8. 20145205 《Java程序设计》实验报告五:Java网络编程及安全

    20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...

  9. 20145212 实验五《Java网络编程》

    20145212 实验五<Java网络编程> 一.实验内容 1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成 ...

随机推荐

  1. 43-python-自己的词典

    可以用python实现一个自己的词典, 就是在网上下一个英汉词典,作为自己的词库,然后整理出一个json文件,存起来,查词时,直接读取查询: 处理时可以用正则表达式处理: https://www.cn ...

  2. db2 创建用户及授权

    1.创建系统用户dbuser/ehong隶属于db2users 2.C:\Program Files\IBM\SQLLIB\BIN>db2 connect to AKZXTEST数据库连接信息  ...

  3. Netty 系列(三)Netty 入门

    Netty 系列(三)Netty 入门 Netty 是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络服务器和客户端程序.更多请参考:Netty Github 和 Netty中文 ...

  4. swift 设置string 中汉字中变色等处理代码

    我们在做弹窗 或者显示label string的时候经常会用到字体变色 变大 等特殊处理, swift中提供一个函数 NSMutableAttributedString 使用方法简介 var main ...

  5. eclipse新建web项目,发布 run as 方式和 new server然后添加项目方式。 后者无法自动编译java 成class文件到classes包下。

    eclipse新建web项目,发布 run as 方式和 new server然后添加项目方式. 后者无法自动编译java 成class文件到classes包下. 建议使用run as  -  run ...

  6. ubuntu14.04 Samba服务无法访问 可能没有权限 指定的网络名不再可用的问题

    按常规配置后,在windows资源管理器中登陆samba服务器,看得到分享目录却无法打开,弹出"无法访问.您可能没有权限使用网络资源,请与这台服务器的管理员联系以查明您是否有访问权限.指定的 ...

  7. 2018.10.02 NOIP模拟 矩阵分组(二分答案)

    传送门 考场上并不会写二分的check函数,下来看了看题解发现真是妙极. 不难想到每次直接从四个角各按阶梯状拓展出合法区域A,再检验B是否合法就行了.(然而考场上写的弃疗了) 于是题解用了一些小技巧优 ...

  8. 2018.09.16 loj#10243. 移棋子游戏(博弈论)

    传送门 题目中已经给好了sg图,直接在上面跑出sg函数即可. 最后看给定点的sg值异或和是否等于0就判好了. 代码: #include<bits/stdc++.h> #define N 2 ...

  9. 2018.08.29 hdu3507 Print Article(斜率优化dp)

    传送门 这应该算是斜率优化的模板题了. 就是要求打印n个数,每个数有一个参数a[i],每打印一段连续的数[l,r]需要的花费是(a[[l]+...+a[r])2+m" role=" ...

  10. hdu-1058(动态规划)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1058 题意:求只由2,3,5,7的乘积组成的数,输出格式见output 思路:开始想打表,后来打表超时 ...