(websocket)协议中Ping Pong,Socket通讯ping pong(长连接),心跳包

-- Socket读写数据:流Socket,数据包Socket。?
   1.流套接字(SOCK_STREAM):流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。
   2.数据报套接字(SOCK_DGRAM):数据报套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP(User Datagram Protocol)协议进行数据的传输。由于数据包套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。
   3.原始套接字(SOCK_RAW):原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。

-- Socket类型,名字/常量 描述
 SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,这个 socket是使用TCP来进行传输。
 SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用UDP来进行它的连接。
 SOCK_SEQPACKET 这个协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。
 SOCK_RAW 这个socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、traceroute使用该协议)
 SOCK_RDM 这个类型是很少使用的,在大部分的操作系统上没有实现,它是提供给数据链路层使用,不保证数据包的顺序

  socket接收数据长度设置记录:近期在项目中使用原先封装的socket库时发现当长度超过1024时,接收到的字符串会有“烫烫烫”的标志出现,之前有看过大神调侃的“烫烫烫屯屯屯”,直觉地想到应该是数组的长度部分设置有问题。检查代码发现,用于接收的buffer长度为1024,而在使用socket的recv函数中也将最大长度设置为了1024,同时将buffer中的数组拷贝出去的长度也为1024,因此该字符串中没有‘\0’的结束符,打印出来未初始化栈空间的值,也就出现了著名的"手持两把锟斤拷,口中疾呼烫烫烫。脚踏千朵屯屯屯,笑看万物锘锘锘"。将recv函数中最大长度设置为1023或者将buffer的长度改为1025即可解决,这样就也有结束符,也就不会出现上述现象了。
   WebSocket连接本质上是TCP连接,不需要每次传输都带上重复的头部数据,所以它的数据传输量比轮询和Comet技术小 了很多。Comet技术又可以分为长轮询和流技术。

  Android使用Socket分包下载字节流数据并生成文件- https://blog.csdn.net/S_Alics/article/details/81558075
任务要求:1、请求需要下载数据的总大小; 2、使用Socket从服务器分段下载字节流数据(byte[]数据); 3、以byte[]的形式追加保存到.txt文件中。

- websocket协议,长连接;Http短连接
WebSocket如何建立连接、交换数据的细节,以及数据帧的格式。
 WebSocket复用了HTTP的握手通道。具体指的是,客户端通过HTTP请求与WebSocket服务端协商升级协议。协议升级完成后,后续的数据交换则遵照WebSocket的协议。

 websocket协议是基于tcp的网络协议,实现了浏览器与客户端的全双工通信,与http协议不同的是,它允许服务器主动推送消息给客户端。
 websocket协议分为两部分,一是握手建立连接;二是数据传输。
 建立连接:websocket的连接建立是基于http协议的。数据传输:websocket协议中数据是通过一系列的帧来传输。出于安全性考虑,所有客户端发往服务器的数据帧需要掩码,若服务器收到未掩码的数据帧将会主动断开连接;所有服务器发往客户端的数据帧不能掩码,若客户端收到掩码的数据帧将会主断开连接。

- Android 长连接,怎么处理心跳机制
  维护任何一个长连接都需要心跳机制,客户端发送一个心跳给服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一次完整的握手,这个握手是让双方都知道他们之间的连接是没有断开,客户端是在线的
  如果超过一个时间的阈值,客户端没有收到服务器的应答,或者服务器没有收到客户端的心跳,那么对客户端来说则断开与服务器的连接重新建立一个连接,对服务器来说只要断开这个连接即可。

- (websocket)协议中Ping Pong,长连接

  WebSocket为了保持客户端、服务端的实时双向通信,需要确保客户端、服务端之间的TCP通道保持连接没有断开。然而,对于长时间没有数据往来的连接,如果依旧长时间保持着,可能会浪费包括的连接资源。但不排除有些场景,客户端、服务端虽然长时间没有数据往来,但仍需要保持连接。这个时候,可以采用心跳来实现。
  发送方->接收方:ping;
  接收方->发送方:pong;
  ping、pong的操作,对应的是WebSocket的两个控制帧,opcode分别是0x9、0xA。

  websocket ping pong:目前的话,浏览器中没有相关api发送ping给服务器,只能由服务器发ping给浏览器,浏览器返回pong消息;

  WebSocket控制帧有3种:Close(关闭帧)、Ping以及Pong。控制帧的操作码定义了0x08(关闭帧)、0x09(Ping帧)、0x0A(Pong帧)。Close关闭帧很容易理解,客户端如果接受到了就关闭连接,客户端也可以发送关闭帧给服务端。Ping和Pong是websocket里的心跳,用来保证客户端是在线的,一般来说只有服务端给客户端发送Ping,然后客户端发送Pong来回应,表明自己仍然在线。

WebSocket协议深入探究-https://www.sohu.com/a/227600866_472869
OPCODE:4位 , 解释PayloadData,如果接收到未知的opcode,接收端必须关闭连接。
0x0表示附加数据帧
0x1表示文本数据帧
0x2表示二进制数据帧
0x3-7暂时无定义,为以后的非控制帧保留
0x8表示连接关闭
0x9表示ping
0xA表示pong
0xB-F暂时无定义,为以后的控制帧保留

- WebSocket分包,粘包,连包,半包
  网上很多资料都说WebSocket不会粘包,半包。OK,这是正确的,因为上述将数据帧的时候我们已经看到WebSocket会将大的数据,自动分片发送。所以WebSocket会自动分包发送,因为这种分包发送,WebSocket的数据不会溢出接收缓冲区,所以也不会有半包的情况发送。
  但是关于粘包,和连包,我看到一部分资料都说不会。因为WebSocket具有帧头信息,所以不会粘包?这是不完全正确的,要知道Tcp的报文也是具有包头信息的,只不过Socket已经处理了。而且经过我对我们项目服务器实际压力测试,发现WebSocket会粘包,连包。不同的是,WebSocket的数据中拥有包头信息,但Tcp没有(实际开发中,我们自己一定会加个包头来分割封包的,WebSocket只是替我们设计了一个包头而已),但对这个包头分割的处理,还是要我们自己完成,WebSocket不会代劳,如果我们自己不处理,抱歉,妥妥的粘包,连包

Websocket协议原理与实现(一)- https://www.jianshu.com/p/1ee01218097b
A barebones WebSocket client and server implementation written in 100% Java- https://github.com/TooTallNate/Java-WebSocket
WebSocket协议详解及应用- https://blog.csdn.net/u014520745/article/details/52639452
WebSocket的ping与pong的java实现- https://blog.csdn.net/u010770993/article/details/70312279

- Socket通讯ping pong
  做一个socket网络传输的项目,在使用TCP进行传输的时候,接收端有时候会因为写入到文件的时间而造成一定的延时,所以在接收端使用了ping-pong buffer的策略进行优化。

 ping-pong机制- https://blog.csdn.net/chenyu201003/article/details/81449762
 项目用到的Socket通讯ping pong流程图- https://blog.csdn.net/hufei20082008/article/details/53513918?utm_source=blogxgwz2
 Socket默认是长链接,为了知道Client和Server链接是否正常,项目中使用的ClientSocket和ServerSocket都有一个心跳的线程,这个线程主要是为了检测Client和Server是否正常链接,Client和Server是否正常链接主要是用ping pong流程来保证的.

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
WebSocket 是一个基于 TCP 协议实现的全双工通信协议,它可以在客户端与服务器之间建立一个持久性的连接,双方可以通过该连接进行实时的数据交互。但是,由于 WebSocket 连接是长连接,因此在一定时间内可能会出现连接空闲,导致连接断开的情况。为了解决这个问题,WebSocket 通常会通过实现心跳机制来保持连接的活跃性,即通过定时向对方发送“心跳包”来维持连接的状态。 下面是一个基于 Java 实现的 WebSocket 心跳机制的示例代码: ```java import java.net.URI; import java.net.URISyntaxException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; public class WebSocketHeartbeatExample { private static final String SERVER_URL = "ws://localhost:8080/ws"; private static WebSocketClient client; private static ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); public static void main(String[] args) throws URISyntaxException { client = new WebSocketClient(new URI(SERVER_URL)) { @Override public void onOpen(ServerHandshake handshakedata) { System.out.println("WebSocket opened"); startHeartbeat(); } @Override public void onMessage(String message) { System.out.println("Received message: " + message); } @Override public void onClose(int code, String reason, boolean remote) { System.out.println("WebSocket closed: " + reason); stopHeartbeat(); } @Override public void onError(Exception ex) { System.out.println("WebSocket error: " + ex.getMessage()); } }; client.connect(); } private static void startHeartbeat() { executor.scheduleAtFixedRate(() -> { if (client != null && client.isOpen()) { System.out.println("Sending heartbeat message"); client.send("ping"); } }, 0, 5, TimeUnit.SECONDS); } private static void stopHeartbeat() { executor.shutdown(); } } ``` 在上述代码,我们首先创建了一个 WebSocketClient 对象,然后通过 connect() 方法与服务器建立连接。在连接成功后,我们通过 onOpen() 方法开始发送心跳包,即每隔一定时间(这里设置为 5 秒)向服务器发送一个 ping 消息。如果在发送心跳包的过程出现异常或连接断开,我们则需要停止心跳包的发送,即通过 stopHeartbeat() 方法停止定时器。 需要注意的是,由于 WebSocketClient 对象是在主线程创建的,因此在定时器不能直接操作 WebSocketClient 对象,否则会出现线程安全问题,因此我们需要将 WebSocketClient 对象的操作封装在一个线程安全的方法,即通过 executor.scheduleAtFixedRate() 方法来启动一个定时任务,该方法会在指定的时间间隔内周期性地执行指定的任务(这里指发送心跳包)。 在实际应用,我们可以根据实际需要调整心跳包的发送频率和内容,以提高连接的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值