首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

膨胀了!我要手写QQ底层!(附源码)

本文将介绍: Protobuf序列化 TCP拆包与粘包 长连接握手认证 心跳机制 重连机制 消息重发机制 读写超时机制 离线消息 线程池 AIDL跨进程通信 本想花一部分时间介绍一下利用AIDL实现多进程通信...我们分析一下,ims(IM Service,下文简称ims)应该是有初始化、建立连接、重连、关闭连接、释放资源、判断长连接是否关闭、发送消息等功能,基于上述分析,我们可以进行一个接口抽象: public...callback); /** * 重置连接,也就是重连 * 首次连接也可认为是重连 */ void resetConnect(); /** * 重置连接,也就是重连 * 首次连接也可认为是重连 *...粘包就是在socket读取,读到了实际意义上的两个多个数据包的内容,同时将其作为一个数据包进行处理。...代码写了这么多,我们先来看看运行后的效果,先贴上缺失的消息发送代码及ims关闭代码以及一些默认配置项的代码。 发送消息: ? 关闭ims: ? ims默认配置: ?

1.5K3130

Tomcat各种网络异常场景解决方案及优化

java.net.SocketException: Connection reset/Connect reset by peer: Socket write error 连接重置。...java.net.SocketException: Broken pipe 通信管道已坏。...超过该长度,内核会向客户端发送RST,这样客户端会触发“Connection reset”异常。 Tomcat#maxConnections 指Tomcat在任意时刻接收和处理的最大连接数。...当Tomcat接收连接数达到maxConnections,Acceptor线程不会再从accept队列取走连接,这时accept队列中的连接会越积越多。...断开连接四次挥手的最后一个阶段,客户端要等待2MSL,保证服务端收到客户端ack(如果服务端没有收到最后一次挥手ack会重试,这时客户端需重新发送ack),所以在这个时间段内不会释放端口,若并发量过大会导致大量

1K30
您找到你想要的搜索结果了吗?
是的
没有找到

Tomcat各种网络异常场景解决方案及优化

java.net.SocketException: Connection reset/Connect reset by peer: Socket write error 连接重置。...java.net.SocketException: Broken pipe 通信管道已坏。...超过该长度,内核会向客户端发送RST,这样客户端会触发“Connection reset”异常。 Tomcat#maxConnections 指Tomcat在任意时刻接收和处理的最大连接数。...当Tomcat接收连接数达到maxConnections,Acceptor线程不会再从accept队列取走连接,这时accept队列中的连接会越积越多。...断开连接四次挥手的最后一个阶段,客户端要等待2MSL,保证服务端收到客户端ack(如果服务端没有收到最后一次挥手ack会重试,这时客户端需重新发送ack),所以在这个时间段内不会释放端口,若并发量过大会导致大量

70930

socket异常问题

该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是假如一端的Socket被关闭(主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect...b) 在数据传输的过程中,浏览器或者接收客户端关闭了,而服务端还在向客户端发送数据。 java.net.SocketException: Broken pipe。该异常在客户端和服务器均有可能发生。...双方周期性的发送数据给对方,同时也从对方接收“心跳数据”,如果连续几个周期都没有收到对方心跳,则可以判断对方或者宕机或者异常退出或者网络不通,此时也需要主动关闭己方连接;如果是客户端可在延迟一定时间后重新发起连接...下面就遇到的问题做一些相关的梳理工作 问题记录一、 在做socket客户端链接服务端,有时候会遇到获取不到输入输出流的情况。...代码1会出现无法获得输出流的错误信息,原因就是tcp协议是全双工通信,当一个流关闭了那么socket也无法正常工作了。 具体还要了解tcp协议相关的内容。

2.3K40

面试之ActiveMQ

这得从 java 的 java.net.SocketException 异常说起。简单点说就是当网络发送发送一堆数据,然后调用 close 关闭连接之后。...这些发送的数据都在接收者的缓存里,接收者如果调用 read 方法仍旧能从缓存中读取这些数据,尽管对方已经关闭了连接。但是当接收者尝试发送数据,由于此时连接已关闭,所以会发生异常,这个很好理解。...abort: recv failed 错误。...JMS(Java 消息服务):是一个 Java 平台中关于面向消息中间件(MOM)的 API,用于在两个应用程序之间,分布式系统中发送消息,进行异步通信。...③ 如果 Session 是事务的,则只要消息接收者有一条消息没有确认,发送消息期间 MOM 客户端某一方突然宕机了,则该事务范围中的所有消息 MOM 都将重发。

38900

网络编程

两台计算机之间通信的必备有素 端口号:计算机中应用的标号(代表一个应用程序) 0-1024 为系统使用保留端口; 常见端口:http:80,stmp:25,ftp:21; 有效端口0-65536,开发者可以的端口是...客户端创建 Socket 作为通信的 Client 端 Client 端链入 Server 端后建立可靠的、双向的、持续性的、点对点的通讯连接,即可通信。...UDP步骤: 创建一个DatagramSocket用于表示发送端,通过send方法发送数据报 创建一个DatagramSocket用于表示接收端,通过receive方法接收数据报 需求:两个客户端相互聊天...用户1:先接收消息发送消息 1 package UDPClient2; 2 3 import java.io.IOException; 4 import java.io.UnsupportedEncodingException...socket.send(sndPack); 29 30 31 //接收消息

49020

自已开发IM有那么难吗?手把手教你自撸一个Andriod版简易IM (有源码)

我们分析一下,ims(IM Service,下文简称ims)应该是有初始化、建立连接、重连、关闭连接、释放资源、判断长连接是否关闭、发送消息等功能。...我们来瞄一眼: 可以看到,非首次进行连接,也就是连接一个周期失败后,进行重连,会先让线程休眠一段时间,因为这个时候也许网络状况不太好,接着,判断ims是否已关闭或者是否正在进行重连操作,由于重连操作是在子线程执行...粘包就是在socket读取,读到了实际意义上的两个多个数据包的内容,同时将其作为一个数据包进行处理。...发送消息: 关闭imsims默认配置: 还有,应用层实现的ims client启动器: 由于代码有点多,不太方便全部贴上,如果有兴趣可以下载本文的完整demo进行体验。...这种情况有很多种原因,比如wifi不可用、用户进入了地铁电梯等网络不好的场所、应用没打开已退出登录等,总的来说,就是没有办法正常接收消息。 如果是长连接正常,那没什么可说的,服务端直接转发即可。

98130

自已开发IM有那么难吗?手把手教你自撸一个Andriod版简易IM (有源码)

我们分析一下,ims(IM Service,下文简称ims)应该是有初始化、建立连接、重连、关闭连接、释放资源、判断长连接是否关闭、发送消息等功能。 基于上述分析,我们可以进行一个接口抽象: ? ?...可以看到,非首次进行连接,也就是连接一个周期失败后,进行重连,会先让线程休眠一段时间,因为这个时候也许网络状况不太好,接着,判断ims是否已关闭或者是否正在进行重连操作,由于重连操作是在子线程执行,为了避免重复重连...粘包就是在socket读取,读到了实际意义上的两个多个数据包的内容,同时将其作为一个数据包进行处理。 引用一张图片来解释一下在TCP出现拆包、粘包以及正常状态下的三种情况: ?...代码写了这么多,我们先来看看运行后的效果,先贴上缺失的消息发送代码及ims关闭代码以及一些默认配置项的代码。 发送消息: ? 关闭ims: ? ims默认配置: ?...这种情况有很多种原因,比如wifi不可用、用户进入了地铁电梯等网络不好的场所、应用没打开已退出登录等,总的来说,就是没有办法正常接收消息

1.3K31

Linux TCP RST情况

问题就出在“我不接受数据” 上,如果此时客户端还往服务器发送数据,服务器内核接收到数据,但是发现此时Socket已经close了,则会返回“RST”标志给客户端。...Apple push 服务也有这个问题,而且是不可预期的偶发性连接被rst;rst 前第一个消息write 是成功的,而第二条写才会告诉你连接重置, 曾经被它折腾没辙,因此打开每2秒一次tcp keepalive...,固定5分钟tcp连接回收,而且发现连接出错,重发之前10s内消息。...SO_LINGER 应用强制使用rst 关闭 该选项会直接丢弃未发送完毕的send buffer,可能造成业务错误,慎用; 当然内网服务间http client 在收到应该主动关闭,使用改选项,会节省资源...数据错误,不是按照既定序列号发送数据 13.在一个已关闭的socket上接收数据 14.服务器关闭异常终止了连接由于网络问题 客户端没有收到服务器的关闭请求,这称为TCP半打开连接

5.7K10

《FreeSWITCH权威指南》-- 1.PSTN与VoIP基础(笔记)

1.1.2 人工电话交换时代 交换机诞生,它位于整个电话网的中心,用于连接每个用户。用户打电话,先连接到交换机,由接线员手动接通到对方线路。...2)旋转式和升降式交换机:用记发器接收用户的拨号脉冲,然后将其通过译码器译成电码来控制接线器的动作,属于“间接控制”方式。...1.6 电路交换与分组交换 电路交换在通信之前要在通信双方之间建立一条被双方独占的物理通路(由通信双方之间的交换设备和链路逐段连接而成)。...2)MGCF(Media Gateway Control Function):媒体网关控制功能 ①控制IMS-MGW中的媒体信道连接; ②与CSCF通信; ③根据路由号码,为从传统网络来的入局呼叫选择CSCF...SGW不对应用层的消息进行解释,但必须对底层的SCCP(Signaling Connection Control Part,信令连接控制部分)SCTP(Stream Control Transmission

1.5K40

Java之网络编程笔记

如果要连接因特网的服务,不仅要给出端口,还要给出计算机的名称,只有给出IP地址和端口号,才能够请求服务,并接收到应答。...我们在使用PrintWriter需要使用println()函数; 当服务器客户端任意一方请求结束通信,则立刻停止。 问题1:在套接字中会发生阻塞的地方: (1)实例化Socket,会阻塞。...,通过多线程,一个线程接收数据,一个线程发送数据。...该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(主动关闭或者因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect...另一个是一端退出,但退出并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。

54420

啥是SBC_sbc是什么意思的缩写

此外SBC还具有门控功能,即根据特定的条件, 允许禁止某些用户通过其使用IMS网络业务; 4....由于通常NAT/防火墙设备仅对IP和UDP/TCP报文头的地址及端口号进行转换, 并不对消息净荷中的媒体连接信息进行转换, 从而造成NAT/防火墙不支持SIP/H.323/H.248/MGCP等...对消息净荷的媒体连接信息不进行转换。 这里头,[消息净荷]指的是一个帧(包)中传输的用户数据部分。...创建相应的地址映射表项 当终端开始呼叫,SBC修改相应的地址信息,将报文发送给真正的核心设备 所有的信令流、媒体流都可经过SBC进行转发, 另外也可设置媒体流旁路 由于SBC重新指定内网/...利用SBC设备的媒体和信令流的代理功能, 可以将其扩展应用于IP录音解决方案: 无论IP承载网络拓扑如何,接入设备是否支持端口镜像, 只需在网络核心设备(如L3GSR)上连接一台SBC,

1K10

Java面经——计算机网络

只有在接收窗口向前滑动(与此同时也发送了确认),发送窗口才有可能向前滑动。...数据在传输,TCP会对所有数据进行编号,发送方在发送过程中始终保持着一个窗口,只有落在发送窗口内的数据帧才允许被发送;同时接收方也始终保持着一个接收窗口,只有落在窗口内的数据才会被接收。...若接收者仍然返回零窗口,则重置该计时器继续等待;若窗口不为0,则表示应答报文丢失了,此时重置发送窗口后开始发送,这样就避免了死锁的产生。...24.HTTP状态码 1XX:指示信息——表示请求已接收,继续处理 2XX:成功——表示请求已经被成功接收、理解、处理 3XX:重定向——要完成请求必须进行更进一步的操作 4XX:客户端错误——请求有语法错误请求无法实现...对称加密:加密和解密使用同一个秘钥; 非对称加密:加密和解密的秘钥不相同,即公钥和私钥; 哈希算法:将任意长度的信息转换为固定长度的值,不可逆; 数字签名:保证某个消息文件是某人发出认同的。

89720

Connection Reset异常

最近调用其他服务的HTTP接口偶尔会出现java.net.SocketException: Connection reset异常信息。...异常信息 java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java...BufferedInputStream.java:286) at java.io.BufferedInputStream.read(BufferedInputStream.java:345 原因 连接的对方发送了...RST包(Reset),表示连接异常,需要立即释放 往一个已经关闭的连接中写数据 关闭一个接收buffer没有读取完毕的socker连接 项目中的原因是因为服务所在Docker内存不足,导致进程被kill...错误日志:Memory cgroup out of memory: Kill process 104609 RST包的场景 发送请求到一个没有被监听的端口 连接被异常终止(没有经过4次挥手) 检测到半开连接

2.4K10

计算机网络之传输层

超时重传:如果发送方的消息在传输的过程种丢失了,接收方没有收到消息,就会进行超时重传;如果接收发送的确认消息,在传输的过程中丢失,也会进行超时重传,因此 每发送一个消息,都需要设置一个定时器。...=1 表示释放连接 TCP三次握手的过程: 第一次握手:建立连接,客户端(发送方)发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器(接收方)确认; 第二次握手:服务器收到syn...为了避免已经失效的连接请求报文传送到对方,引起错误 TCP连接的释放 TCP四次挥手的过程:TCP连接断开过程:假设Client端发起中断连接请求,也就是发送FIN报文。...但关闭连接,当收到对方的FIN报文通知,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送...传输层的任务是根据通信子网的特性,最佳的利用网络资源,为两个端系统的会话层之间,提供建立、维护和取消传输连接的功能,负责端到端的可靠数据传输。在这一层,信息传送的协议数据单元称为段报文。

15510

消息中间件面试题31道RabbitMQ+ActiveMQ+Kafka

另外, 如果在执行 Basic.Publish 设置 mandatory=true ,则在遇到可能出现 blackholed 情况,服务器会通过返回 Basic.Return 告之当前 message...这得从 java 的 java.net.SocketException 异常说起。简单点说就是当网络发送发送一堆数据,然后调用 close 关闭连接之后。...这些发送的数据都在接收者的缓存里,接收者如果调用 read 方法仍旧能从缓存中读取这些数据,尽管对方已经关闭了连接。但是当接收者尝试发送数据,由于此时连接已关闭,所以会发生异常,这个很好理解。...abort: recv failed 错误。...所以在发送持久化消息,请务必开启事务模式。其实发送非持久化消息也建议开启事务,因为根本不会影响性能。 5.消息的不均匀消费。 有时在发送一些消息之后,开启 2 个消费者去处理消息

1K00
领券