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

客户端代码实现:

package com.chenyu.string.cn;import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;public class ClientTest {public static Socket socket;public static final String LocalHOST = "127.0.0.1";public static final int PORT = 1234;public static void main(String[] args) {Client(LocalHOST, PORT);}public static void Client(String address, int port) {try {socket = new Socket(address, port);} catch (Exception e) {System.out.println("connection reset");return;}if (socket != null && socket.isConnected()) {try {socket.setOOBInline(true);OutputStream out = socket.getOutputStream();OutputStreamWriter outWriter = new OutputStreamWriter(out);outWriter.write(67); // 向服务器发送字符"C"outWriter.write("hello world\r\n");socket.sendUrgentData(65); // 向服务器发送字符"A"socket.sendUrgentData(322); // 向服务器发送字符"B"outWriter.flush();socket.sendUrgentData(214); // 向服务器发送汉字”中”socket.sendUrgentData(208);socket.sendUrgentData(185); // 向服务器发送汉字”国”socket.sendUrgentData(250);socket.close();} catch (Exception e) {System.out.println("has throw exception");e.printStackTrace();} finally {try {if (socket != null) {socket.close();}} catch (IOException e) {System.out.println("socket close fail");}}} else {System.out.println("socket is null or socket connect fail");}}
}

服务端代码实现:

package com.chenyu.string.cn;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class TestInline {public static ServerSocket serverSocket;public static Socket socket;public static void main(String[] args) {try {serverSocket = new ServerSocket(1234);} catch (IOException e1) {System.out.println("serverSocket is fail");return;}System.out.println("服务器已经启动,端口号:1234");while (true) {try {socket = serverSocket.accept();socket.setOOBInline(true);InputStream in = socket.getInputStream();InputStreamReader inReader = new InputStreamReader(in);BufferedReader bReader = new BufferedReader(inReader);String result;while ((result = bReader.readLine()) != null) {System.out.println(result);}
//              char [] cha = new char[1024];
//              int len = inReader.read(cha);
//              System.out.println(new String(cha,0,len));socket.close();} catch (Exception e){System.out.println("read data fail");} finally {if (socket != null) {try {socket.close();} catch (IOException e) {System.out.println("socket close fail");}}}}}
}    socket = serverSocket.accept();socket.setOOBInline(true);InputStream in = socket.getInputStream();InputStreamReader inReader = new InputStreamReader(in);BufferedReader bReader = new BufferedReader(inReader);String result;while ((result = bReader.readLine()) != null) {System.out.println(result);}
//              char [] cha = new char[1024];
//              int len = inReader.read(cha);
//              System.out.println(new String(cha,0,len));socket.close();} catch (Exception e){System.out.println("read data fail");} finally {if (socket != null) {try {socket.close();} catch (IOException e) {System.out.println("socket close fail");}}}}}
}

运行结果(先运行服务端,后运行客户端):

服务器已经启动,端口号:1234
ABChello world
中国

说明使用sendUrgentData方法发送数据后,系统会立即将这些数据发送出去;而使用write发送数据,必须要使用flush方法才会真正发送数据。

在使用setOOBInline方法打开SO_OOBINLINE选项时要注意是必须在客户端和服务端程序同时使用setOOBInline方法打开这个选项,否则无法命名用sendUrgentData来发送数据。

总结:

我们还可以通过socket.sendUrgentData(0xff);来检测是否与服务端连通,和ping IP 效果差不多,其它的socket.isConnected() socket.isOutputShutdown()都是本地检测,我们上面socket发送数据,如果在安卓客户端,我们可以用这个来发送心跳包,
类似上面客户端的代码,通过后台下发的IP和端口配置,开启线程,out.write(data),通过handler.postDelay(Runable, delayTime)发送心跳包给服务端。

java之socket的OOBInline和UrgentData和发送心跳包研究相关推荐

  1. Android Socket通信 发送心跳包 重连

    最近项目中,有使用Socket与后端进行通信,然后简单的了解了下Socket使用,大致流程是配置服务端的Ip.端口号,连接,监听数据和发送数据,数据的读取和发送都是以流的形式实现的,然后自己将项目中的 ...

  2. Socket网络编程tcp聊天案例(心跳包,多线程,断线重连机制)

    实现一个聊天的案例,使用多线程和心跳包.当服务器断开的时候,客户端会自动尝试重新连接,当服务器开启的时候,客户端会自动连接 Server服务器类 package Demo3_Chat;import c ...

  3. android 心跳包,android socket 发送心跳包

    在项目中,有如下需求:Android客户端向服务器发送数据,收到服务器返回的数据发送成功标识后,客户端即与服务器建立数据一来一往的心跳连接,若服务器端断开时,客户端接收到通知,关闭Service停止发 ...

  4. java Socket 长连接 心跳包 客户端 信息收发 demo

    今天写了个socket的测试小程序,代码如下 import java.io.IOException; import java.io.InputStream; import java.io.Output ...

  5. java udp心跳机制,Socket心跳包机制总结

    跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着.事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一 ...

  6. java socket——心跳包

    首先先说说心跳包在socket连接中的意义: 通过socket连接的双方为了保证在一段时间未发消息不被防火墙断开连接或者使对方及时知道自己是否已经断线而定期给对方发送的某些特殊标识字符,这个字符可以根 ...

  7. 【Java 网络编程】客户端 Socket 配置 ( 超时时间 | 端口复用 | Nagle 算法 | 心跳包机制 | 连接关闭机制 | 缓冲区大小 | 性能权重设置 | 紧急数据设置 )

    文章目录 I 设置读取超时时间 II Socket 复用绑定端口设置 III 开启 Nagle 算法 ( 沾包 ) IV 心跳包机制 V 连接关闭处理 VI Socket 紧急数据内敛设置 VII S ...

  8. java websocket心跳包_web socket 心跳包的实现方案

    web socket 心跳包的实现方案05/30/2010 现在网络环境错综复杂,socket心跳包是获得健康强壮的连接的有效解决方案,今天,我们就在web socket中实现心跳包方案,是的,尽管我 ...

  9. 【Socket】关于socket长连接的心跳包

    TCP的socket本身就是长连接的,那么为什么还要心跳包呢? 在smack里有个30s发送一个空消息的线程,同样关于心跳包(keepalive) 据网络搜索到的资料解释如下 内网机器如果不主动向外发 ...

最新文章

  1. Spark- 使用第三方依赖解析IP地址
  2. java之spring mvc之初始spring mvc
  3. 张老师讲Python~
  4. 更改数据库的兼容模式
  5. c语言定义学生结构体类型,C语言中结构体的三种定义方式
  6. java实现内存修改器_魔兽3内存修改器 v8
  7. javascript 判断string是否包含某个字符串
  8. java 获取bean的注解_如何获取spring 注解的bean
  9. 大型网站技术架构读书笔记
  10. STC51入门笔记(郭天祥C语言)---第十一节:使用DS12C887时钟芯片设计高精度时钟
  11. JS编程:查找数组元素位置
  12. Android校园二手交易平台
  13. .NET 经常被面试官问到的问题
  14. 使用信用卡 要避开这些陷阱
  15. mysql的设置参数中max_allowed_packet
  16. java中如果int类型超出了它的范围
  17. FCoin“暴雷”投资人该怎么办?律师这样建议
  18. Spring IOC(控制反转)的理解
  19. weather 城市编号
  20. 恭喜孙叫兽在CSDN年度之“战”中脱颖而出——喜提一等奖(小米手环+定制勋章)

热门文章

  1. 精简ABP的模块依赖
  2. dotnet中的counters说明(三)
  3. 记一次 .NET 某电商交易平台Web站 CPU爆高分析
  4. NET问答: C# 中有哪些 HttpPost 工具包
  5. 如何容器化你的 ASP.Net Core
  6. 改进你的代码-扩展了一下IEnumerableT
  7. Flash 生命终止,HTML5能否完美替代?
  8. 从业务需求抽象成模型解决方案
  9. 《ASP.NET Core 微服务实战》-- 读书笔记(第7章)
  10. 宣告推出.NET Core 3.0 Preview 7