IM即时通讯实现原理

2023-11-10

即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议。前 者是以数据流的形式,将传输数据经分割、打包后,通过两台机器之间建立起的虚电路,进行连续的、双向的、严格保证数据正确性的文件传输协议。而后者是以数 据报的形式,对拆分后的数据的先后到达顺序不做要求的文件传输协议。


QQ就是使用UDP协议进行发送和接收消息的。当你的机器安装了OICQ以后,实际上,你既是服务端(Server),又是客户端(Client)。当你登录OICQ时,你的OICQ作为Client连接到腾讯公司的主服务器上,当你看谁在线时,你的OICQ又一次作为Client从QQ Server上读取在线网友名单。当你和你的OICQ伙伴进行聊天时,如果你和对方的连接比较稳定,你和他的聊天内容都是以UDP的形式,在计算机之间传 送。如果你和对方的连接不是很稳定,QQ服务器将为你们的聊天内容进行中转。其他的即时通信软件原理与此大同小异。

 

一般的步骤:

 

首先,用户A输入自己的用户名和密码登录即时通讯服务器,服务器通过读取用户数据库来验证用户身份,如果用户名、密码都正确,就登记用户A的IP地址、IM客户端软件的版本号及使用的TCP/UDP端口号, 然后返回用户A登录成功的标志,此时用户A在 IM系统中的状态为在线(Online Presence)。

 

其次,根据用户A存储在IM服务器上的好友列表 (Buddy List),服务器将用户A在线的相关信息发送到也同时在线的即时通讯好友的PC机,这些信息包括在线状态、IP地址、 IM客户端使用的TCP端口(Port)号等,即时通讯好友PC机上的即时通讯软件收到此信息后将在PC桌面上弹出一个小窗口予以提示。

 

第三步,即时通讯服务器把用户A存储在服务器上的好友列 表及相关信息回送到他的PC机,这些信息包括也在线状态、IP地址、IM客户端使用的TCP端口(Port)号等信息,用户A的PC机上的IM客户端收到 后将显示这些好友列表及其在线状态。

 

接下来,如果用户A想与他的在线好友用户B聊天,他将直接通过服务器发送过来的用户B的IP地址、TCP端口号等信息,直接向用户B的PC机发出聊天信息,用户B的IM客户端软件收到后显示在屏幕上,然后用户B再直接回复到用户A的PC机,这样双方的即时文字消息就不通过 IM服务器中转,而是通过网络进行点对点的直接通讯,这称为对等通讯方式(Peer To Peer) 。在商用即时通讯系统中,如果用户A与用户B的点对点通讯由于防火墙、网络速度等原因难以建立或者速度很慢, IM服务器还提供消息中转服务,即用户A和用户B的即时消息全部先发送到IM服务器,再由服务器转发给对方。早期的IM系统,在IM客户端和IM服务器之间通讯采用采用UDP协议,UDP协议是不可靠的传输协议,而在 IM客户端之间的直接通讯中,采用具备可靠传输能力的TCP协议。随着用户需求和技术环境的发展,目前主流的即时通讯系统倾向于在即时通讯客户端之间、即时通讯客户端和即时通讯服务器之间都采用TCP协议 。

 

S——C1
|
| C1每次想和C2通信,先向S递一个申请,然后S同意,把信息转交C2,  以后每次通信都这样 
C2

 

S——C1
|
| C1第一次想和C2通信,向S递一个申请,S同意,告诉C1,C2,然后 C1和 C2之间建立了一条连接,可以直接通信,无需经过S. 
C2

 

第 一种,对服务器的性能要求比较高,要求服务器可以同时处理很高的连接数,因为所有信息都要通过服务器进行传递,同时,它可以对所传递的信息进行控制。

 

第二种,仅仅是用户登陆或下线时与服务器进行连接,平时进行通信时,是用户之间直接进行点对点的连接,这种实现更合理一 些。

 

 

QQ聊天信息是在两个用户间直接通信的,而MSN要经过服务器中转.

QQ当用户登陆时,用户需要首先与qq服务器进行连接进行登录,服务器会向客户返回一些信息,比如你的好有的在线情况以及ip的信息,然后客户可以与你所请求的朋友进行点对点连接,两者互相通信。


那 如果 c1和c2都在私网内,要通过路由器做NAT才能出去的话,他们之间的socket是如何建立的呢?
看一下下面的协议.

Simple Traversal of User Datagram Protocol (UDP) Through Network
Address Translators (NATs) (STUN)。

STUN,是为了实现透明的穿透NAT,而定义的一套协 议。他使本地的内网的机器,具有取得,能够得知他的NAT网关的IP,NAT类型的能力。

为什么需要STUN:

因为NAT虽然解决了IP地址稀少的问题,但是也带来了很多的问题。比如所有P2P应用,像文件SHARE,多媒体,和在线游戏等等.
为了解决这个问题,有人将 Application Layer Gateways (ALGs) 放到了NAT中,
ALGs 也有严重的问题,比如跟不上速度太块的CLIENT,每一个应用都需要单独的实现。
跟不上应用的发展。
为了克服ALGS的问题,又提出了the Middlebox Communications (MIDCOM) protocol
中间合协议。可是MIDBOX协议使 ,一些CLIENT可以控制NAT/防火墙的行为,通过这个
把应用协议和NAT部分分开,把ALGS从基本NAT里面处理开。不过因为要处理MIDBOX,那么
所有的NAT或者防火墙都要升级,

因为上面种种原因:
The protocol described here, Simple Traversal of UDP Through NAT
(STUN), allows entities behind a NAT to first discover the presence
of a NAT and the type of NAT, and then to learn the addresses
bindings allocated by the NAT. STUN requires no changes to NATs, and
works with an arbitrary(任意) number of NATs in tandem between the
application entity and the public Internet.

要想穿透NAT,首先知道NAT的一些特性:
NAT分为4种(加上防火墙的话,多几种情况):
1.完全透明NAT(Full Cone NAT):
从相同内部主机(IN IPX) +端口(IN PORTX)发送的数据MAPING为相同的IP(OUT IP X)和端口(OUT PORT X)发送带外网.
并且 从另一个服务器(Y),如果直连到MAPING的IP(OUT IP X)和端口(OUT PORT X )上,数据将会被转发到内部主机上. (IN IPX), (IN PORTX).
//也就是说进内部网的数据包的SPORT,SPORT不受限制
2.受限NAT(Restricted Cone),
从相同内部主机IN IPX) +端口((IN PORTX))发送的数据MAPING为相同的IP(X)和端口发送带外网.
和完全NAT不同的是,只有当为X时,外部机器的的请求就被转发到主机IN IPX) +端口((IN PORTX)。
也就是说进内部网的数据包的,SPORT不受限制,SIP受限制,只能为NAT MAP数据的IP
3,端口受限NAT(Port Restricted Cone:)
和受限NAT不同的是,只有当外部主动请求的的源IP和端口,等于内部网发送的请求的目的IP和端口。
4.对称NAT(Symmetric)
如果发送的包的目的IP AND PORT,那么MAPPING IP AND PORT,将相同。
内部网同一台机器,同一个端口 如果目的地址不同,那么MAPPING的端口也不同,
所以只有他主动连的服务器才可能知道他的MAPPING后端口,别的服务器如果想
连他只能靠猜测端口。
总结:
前面3重NAT,MAPING PORT 和 IP,是根据发送包的的内部网的IP和端口决定的。
如果数据的内网IP和端口相同,那么MAPPING后的端口和地址是固定。
这个功能为我们的穿越提供了很好条件。
第4种NAT,打洞后的MAPPING 地址和端口将变地不可靠。很难穿越。
注意SERVERA,和SERVERB是两个公网地址,而不是两台机器,

STUN 的简单操作过程:
发送请求。请求分为两种
1. Binding Requests, sent over UDP,
用来发现是否NAT,用来发现NAT的公网地址,和MAPPING后的端口
2.Binding Response,
服务器产生Binding Response,并把得到的MAPPINGIP 和端口,返回到客户端, 客户端比较MAPPING地址是否 和本机地址相同,如果是说明是本机也是公网,否则判断NAT的类型(判断方法:client uses additional STUN Binding Requests)
3.Binding Error,
4.Shared Secret Requests, sent over TLS [2] over TCP.
这个请求要求服务器返回一临时用户名和密码,用来下一步的Binding Requests/ Response,用来验证信息的完整性
5.Shared Secret Response,
6 Shared Secret Error Response。
STUN 信息结构
STUN 由以后数据结构构成:STUN头+STUN有效载荷
STUN头结构如下: 存储的值都是以网络顺序存放
字段类型
STUN message type Short int 消息类型
Length Short int 有效载荷长度,不包含头长度
transaction ID octet[16] 连接的ID值,检查Request,
和Response

STUN的有效载荷
SHUN的有效载荷 是一些STUN的属性构成,属性的类型由信息的类型来决定。
STUN的属性是定义好了的,属性列表(attribute)如下:
MAPPED-ADDRESS 必选 用在Binding Response,(添入MAPING IP 和PORT)
RESPONSEADDRESS 可选 用在Binding Request,指定Response,发送到哪里
如果没有指定,Response发送到MAPING IP 和 PORT
CHANGE-REQUEST 可选 用在Binding Request。用来决定,CLIENT的NAT类型是限制NAT,还是端口限制NAT,(命令服务器从不同的源端口/IP,Response请求)
CHANGED-ADDRESS 可选 用在Binding Responses告诉Client改变的端口和IP
SOURCE-ADDRESS 必选 只用在Binding Responses,标记信息的源PORT HE IP
USERNAME 可选 Shared Secret Response/ Binding Requests
PASSWORD, 必选 SharedSecret Response
ESSAGEINTEGRITY 可选 用在Binding Responses, Binding Request记录信息的完整性
ERROR-CODE Binding Error Response and Shared Secret Error Response.
UNKNOWN-ATTRIBUTES
REFLECTED-FROM Binding Responses.用于追溯和防止DDOS

穿透的方法和过程
注意SERVER1,和SERVER2是两个公网地址,而不是两台机器.

 

附录: 

一、IM技术概念

IM技术全称Instant Messaging,中文翻译“即时通讯”,它是一种使人们能在网上识别在线用户并与他们实时交换消息的技术,是电子邮件发明以来迅速崛起的在线通讯方 式。

IM的出现和互联网有着密不可分的关系,IM完全基于 TCP/IP网络协议族实现,而TCP/IP协议族则是整个互联网得以实现的技术基础。 最早出现即时通讯协议是IRC(Internet Relay Chat),但是可惜的是它仅能单纯的使用文字、符号的方式通过互联网进行交谈和沟通。随着互连网变得高度发达,即时通讯也变得远不止聊天这么简单,自 1996年第一个IM产品ICQ发明后,IM的技术和功能也开始基本成型,语音、视频、文件共享、短信发送等高级信息交换功能都可以在IM工具上实现,于 是功能强大的IM软件便足以搭建一个完整的通信交流平台。目前最具代表性的几款的IM通讯软件有MSN、Google Talk、Yahoo、Messenger 、腾讯QQ等。

 

二、IM技术原理和工作方式

典型的IM工作方式如下:登陆IM通讯中心(IM通讯服务器),获取一个自建立的历史的交流对象列表(好友列表),然后自身标志为在线状态,当好友列表中的某人在任何时候登录上线并试图通过你的计算机联系你 时,IM系统会发一个消息提醒你,然后你能与他建立一个聊天会话通道进行各种消息如键入文字、通过语音等的交流.


从技术上来说,IM的基本技术原理如下:

通过IM服务器登陆或注销
用户A通过列表找到B,用户B获得消息并与之交谈
通过IM服务器指引建立与B单独的通讯通道

 

第一步,用户A输入自己的用户名和密码登录IM服务器, 服务器通过读取用户数据库来验证用户身份,如果验证通过,登记用户A的IP地址、IM客户端软件的版本号及使用的TCP/UDP端口号,然后返回用户A登录成功的标志,此时用户A在IM系统中的状态为在线(Online Presence)。

 

第二步,根据用户A存储在IM服务器上的好友列表 (Buddy List),服务器将用户A在线的相关信息发送给也同时在线的IM好友的PC机,这些信息包括在线状态、IP地址、IM客户端使用的TCP端口 (Port)号等,IM好友的客户端收到此信息后将在予以提示。

 

第三步是IM服务器把用户A存储在服务器上的好友列表及 相关信息回送到他的客户端机,这些信息包括也在线状态、IP地址、IM客户端使用的TCP端口(Port)号等信息,用户A的IM客户端收到后将显示这些好友列表及其在线状态。

 

三、IM通讯方式

1.在线直接通讯 
如果用户A想与他的在线好友用户B聊天,他将直接通过服务器发送过来的用户B的IP地址、TCP端口号等信息,直接向用户B的PC机发出聊天信息,用户B 的IM客户端软件收到后显示在屏幕上,然后用户B再直接回复到用户A的PC机,这样双方的即时文字消息就不再IM服务器中转,而是直接通过网络进行点对点 的通讯,即对等通讯方式(Peer To Peer)。

2.在线代理通讯 
用户A与用户B的点对点通讯由于防火墙、网络速度等原因难以建立或者速度很慢,IM服务器将会主动提供消息中转服务,即用户A和用户B的即时消息全部先发 送到IM服务器,再由服务器转发给对方。

3.离线代理通讯 
用户A与用户B由于各种原因不能同时在线的时候,如此时A向B发送消息,IM服务器可以主动寄存A用户的消息,到B用户下一次登陆的时候,自动将消息转发 给B。

4.扩展方式通讯 
用户A可以通过IM服务器将信息以扩展的方式传递给B,如短信发送方式发送到B的手机,传真发送方式传递给B的电话机,以email的方式传递给B的电子邮箱等。


早期的IM系统,在IM客户端和IM服务器之间通讯采用UDP协议,UDP协议是不可靠的传输协议,而在IM客户端之间的直接通讯中,采用具备可靠传输能 力的TCP协议。随着用户需求和技术环境的发展,目前主流的IM系统倾向于在IM客户端之间、IM客户端和IM服务器之间都采用TCP协议。


即时通讯相对于其他通讯方式如电话、传真、email等的最大优势就是消息传达的即时性和精确性,只要消息传递双方均在网络上可以互通,使用即时通讯软件传递消息,传递延时仅为1秒种.

 

四、兴起的嵌入式IM工具。

传统的IM在统治了互联网即时通讯领域长达十年之久,以其日趋稳定的定能,与较强的用户黏着度,至今仍统治着这个巨大的市场。然而,软件行业的技术精英们,并不满足于此。他们厚积薄发,一直致力于开发出性能更 为优越的即时通讯工具。当然,在功能上的不断完善,自然是一个必然的发展方向,在Web2.0时代,如何大力增强用户对网站的黏着度,而不仅仅是对于IM 的拥附,已经成为他们的主攻方向了。于是,嵌入式IM工具,应运而生了。

相对以往的传统的即使沟通工具,它们需要用户下载软件包,需要用户进行安装。对于拥有IM产品的网站而言,用户在登陆网站后,不能直接使用其IM工具,对于流量与用户的黏着度,都是有一定影响的。因此在IM 与网站相互依存的今天,没有哪家网络公司,愿意将IM工具孤立开来。

于是,目前,一种新型的嵌入式IM工具就应运而生了。这种IM工具,不需要下载安装,当用户登陆网页后,该IM直接嵌套在网页中,可以直接使用。

而在功能上,则一点也不输于传统的IM,无论是传统的文字沟通的速度与效率,还是近年来越来越成为IM工具必备的音频/视频功能,这种嵌入式IM都能提供非常稳定的传输。更值得一提的是,因为嵌入式IM是嵌套 在网页上的,软件供应商,可以根据网站需求,设计出适合网站风格的IM产品。而不是像传统的IM工具,千篇一律,毫无个性可言。

目前,这类嵌入式IM在社区、交友、社团及协作等类型的 网站上,应用已经较为广泛。在Web2.0时代,将发挥越来越重要的作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IM即时通讯实现原理 的相关文章

  • 5G干货之概述

    我们都生活在4G网络时代 相信各位还记得当时各运营商推出4G技术时 天天催着我们去换卡的场景 现在需要告诉身为 普通老百姓 的你 5G也要悄然问世了 对于 对移动通信领域一无所知 的你 笔者这样给你介绍5G技术是什么 5G 好高端啊 那只是
  • 【Socket】Java Socket编程基础及深入讲解

    转自 https www cnblogs com yiwangzhibujian p 7107785 html Socket是Java网络编程的基础 了解还是有好处的 这篇文章主要讲解Socket的基础编程 Socket用在哪呢 主要用在进
  • 移动端安全通信的利器——端到端加密(E2EE)技术详解

    前言 端到端加密允许数据在从源点到终点的传输过程中始终以密文形式存在 采用端到端加密 又称脱线加密或包加密 时消息在被传输时到达终点之前不进行解密 因为消息在整个传输过程中均受到保护 所以即使有节点被损坏也不会使消息泄露 端到端加密系统与链
  • BLE 和 Zigbee 肉眼读数(更新ing)

    BLE1M 画相位图 可以读出preamble 01010101 同步码 01101011 通过向下向上的轨迹来肉眼读 原理是需要看如何进行调制的 toolbox中是GMSK调制 所以反着推回去 就知道画相位图能直接肉眼读数了 同理Zigb
  • QT UDP简单的通信示例

    UDP user datagram protocol 即用户数据协议 是一个轻量级的 不可靠的 面向数据报的无连接协议 在qt中提供了QUdpSocket类来进行UDP数据报的发送和接收 在Pro中加入network模块 因为upd是无连接
  • 【数字信号处理2】IIR 滤波器设计

    一 实验目的 1 掌握冲激响应法和双线性变换法设计IIR滤波器的原理及具体设计方法 熟悉用双线性设计法设计低通 带通和高通IIR数字滤波器的计算机程序 2 熟悉模拟Butterworth滤波器的设计 掌握冲激响应法和双线性变换法设计数字II
  • cocos2d-x客户端与Java服务器的通信(一)

    o 貌似自己已经有一段时间没有写博客了 其实主要原因还是觉得自己水平有限 加上上班实在是太忙 实在抽不出时间来写博客 言归正传 大家都知道 在网络游戏开发中 网络通信一直是个比较大的难题 一个服务器可能要同时处理几千上万甚至上百万的用户数据
  • 移动通信中的信源编码和调制调节技术

    通信原理 移动通信中的信源编码和调制调节技术的思维导图 一个上课老师留的作业 这个不带图片 带图片的在我发的另一个 移动通信中的信源编码和调制调节技术 3 1 概述 调制就是对消息源信息进行编码的过程 其目的就是使携带信息的信号与信道特性相
  • Qt实现Http通信

    Qt学习需要http传值 研究了好几天终于可以了这里只是一个最简单的通信 我的Qt是5 7 1 在Pro内添加 QT network widget h中的源码 ifndef WIDGET H define WIDGET H include
  • MCP2515独立控制器

    1 简介 MCP2515 是一款独立控制器局域网络 Controller Area Network CAN 协议控制器 完全支持 CAN V2 0B 技术规范 该器件能发送和接收标准和扩展数据帧以及远程帧 MCP2515 自带的两个验收屏蔽
  • 如何将二维数组作为函数的参数传递

    如何将二维数组作为函数的参数传递 今天写程序的时候要用到二维数组作参数传给一个函数 我发现将二维数组作参数进行传递还不是想象得那么简单里 但是最后我也解决了遇到的问题 所以这篇文章主要介绍如何处理二维数组当作参数传递的情况 希望大家不至于再
  • 如何与西门子200 PLC建立连接

    更多关于西门子S7 200PLC内容请查看 西门子200系列PLC学习课程大纲 与西门子200 PLC建立连接很简单 分为以下几步 1 给S7 200PLC通电 按下图1 1所示连接PLC端口 然后给PLC供电 有直流24V和交流220V两
  • Nakagami-m 信道

    Nakagami m 分布是日本学者Nakagami 在1960年的一篇论文中提出的快衰落模型 Nakagami m 的表达式 我们遵照参考文献 1 的说法1 假设接收信号表示如下 r n g
  • RS485、MODBUS通信协议浅显易懂篇

    前言 MODBUS协议是Modicon公司发表的一种串行通信协议 属于OSI模型中应用层的协议 现广泛应用于工业控制领域 它的主要特点是免费开放 支持多种电气接口 如RS 232 RS 485 传输介质可以是双绞线 光纤 无线等 RS485
  • 【Android Socket专题】:UDP通信客户端app的demo的实现

    Android Socket 专题 UDP Client客户端 http blog csdn net shankezh article details 50731287 UDP Server服务器 http blog csdn net sh
  • 蓝牙协议栈实现模式分析

    蓝牙协议栈实现模式分析 广州大学信息与机电工程学院 510405 邹艳碧 广州大学理学院 510405 吴智量 广州大学信息与机电工程学院 510405 李朝晖 摘要 蓝牙技术是未耒无线通信的一个重要的研究方向 本文主要介绍了蓝牙 技术的体
  • Android进程间通信(IPC)机制Binder介绍

    转载自 http blog csdn net luoshengyang article details 6618363 在Android系统中 每一个应用程序都是由一些Activity和Service组成的 这些Activity和Servi
  • http和Tcp的长连接和短连接

    转自 https www cnblogs com fubaizhaizhuren p 7523374 html http协议和tcp ip 协议的关系 1 http是应用层协议 tcp协议是传输层协议 ip协议是网络协议 2 IP协议主要解
  • 【科普】CRC校验(一)什么是CRC校验?

    目录 CRC 循环冗余校验 CRC 校验码的生成 CRC 的发送方与接收方 发送方 接收方 除法异或运算示意图 CRC 循环冗余校验 CRC Cyclic Redundancy Check 循环冗余检验 是一种用于检测数字数据错误的技术 作
  • 自协商功能原理及工作过程

    自协商原理 自协商是通过一种叫做快速连接脉冲 Fast Link Pulse 的信号实现的 简称FLP 自协商的双方通过FLP来交换数据 在具备自协商能力的端口没有Link的情况下 端口一直发送FLP 在FLP中包含着自己的连接能力信息 包

随机推荐

  • 程序员必知的 七 种软件架构模式!

    一种模式就是特定上下文的问题的一种解决方案 然而 很多开发者至今还对各种软件架构模式之间的差别搞不清 甚至对其所知甚少 大体上 主要有下面这7种架构模式 分层架构 多层架构 管道 过滤器架构 客户端 服务器架构 模型 视图 控制器架构 事件
  • 背包算法(贪婪算法)

    一 问题描述 有n 个物品 它们有各自的重量和价值 现有给定容量的背包 如何让背包里装入的物品具有最大的价值总和 二 总体思路 根据动态规划解题步骤 问题抽象化 建立模型 寻找约束条件 判断是否满足最优性原理 找大问题与小问题的递推关系式
  • PyQt界面:左右界面由于控件太多不协调

    问题 在编写软件时 有左右两个子界面 都设置为网格布局 左界面是菜单 右界面是每个菜单对应的内容 当右界面的空间太多时 导致左界面的空间缩小 不协调 正常显示应如下 如下图 右边的一行控件太多 导致子界面左边界面宽度变窄 影响整体协调性 解
  • python熵权法过程中,权重出现nan值问题

    最近在利用熵权法选取最优指标数据时 计算权重得到的是全为nan值的权重 经过分析过程 找到问题所在 数据展示 熵权法步骤 step 1 标准化处理 step 2 计算每个维度的信息熵 step 3 差异系数 step 4 计算权重 step
  • Altium Designer 21的使用(二):电阻电容模型的创建

    TIPS 元件符号是元件在原理图上的表现形式 主要由元件边框 管脚 包括管脚序号和管脚名称 元件名称及元件说明组成 通过放置的管脚来建立电气连接关系 元件符号中的管脚序号是和电子元件实物的管脚一一对应的 在创建元件时 图形不一定和实物完全一
  • java io流读取文件_java的几种IO流读取文件方式

    一 超类 字节流 InputStream 读入流 OutputStream 写出流 字符流 Reader 字符 读入流 Writer 字符写出流 二 文件操作流 字节流 FileInputStream FileOutputStream 字符
  • tensorflow码源-运行流程

    tensorflow码源 运行流程 简介 通过分析用户构建的计算是如何在tensorflow中运行的 了解tensorflow中的基本元素和op kernel和device之间的交互 用户程序 matrix1 tf constant 3 3
  • 如何实现‘请在微信客户端打开链接’

    想要实现请在微信客户端打开链接 在代码中加入以下代码即可 code style font family none display block line height 18px border none code
  • 【编程之路】面试必刷TOP101:动态规划(72-77,Python实现)

    面试必刷TOP101 动态规划 72 77 Python实现 72 连续子数组的最大和 小试牛刀 72 1 动态规划 因为数组中有正有负有0 因此每次遇到一个数 要不要将其加入我们所求的连续子数组里面 是个问题 有可能加入了会更大 有可能加
  • js阻止冒泡事件

    div class open div style width 50 margin 0 auto height 5rem div class open back img style width 2 25rem src image public
  • JAVA switch case 穿透问题

    1 前提 其实开发中很少会用到switch 一般更倾向于if else 但是最近接手的项目 前人写的代码都用switch 但是我一直以来对switch 的理解就跟if一样 然后项目运用的时候才发现这玩意居然还有穿透问题 2 实践 publi
  • 米家扩展程序初始化超时,GCC编译器警告:扩展初始化程序列表仅在c ++ 0x中可用...

    Using this member initialization StatsScreen StatsScreen GameState State level m Level level I get the following warning
  • Eclipse新版本注释的中文大小不一,缩进有问题. Eclipse新版本的坑

    notepad 可以关闭打开标签 左边所有 右边所有 而eclipse的旧版本却没有 就去找了新版本的Eclipse 来用 结果就踩坑了 Eclipse IDE 2020 09 需要jdk11 Eclipse IDE 2020 06 可以用
  • shiro多项目跳转用户身份失效问题排查

    shiro多项目跳转用户身份失效问题排查 1 身份失效问题 最近在项目中遇到过一个问题 统一登录系统中有各个子系统的模块 可点击子系统模块进行跳转 如下图所示 如上图 当用户点击子系统B新窗口打开时 实现跳转成功 当再回到原统一登录系统页面
  • iocrl如何从user space调用到 kernel space,

    iocrl如何从user space调用到 kernel space 还有调用的流程 图1 在上述的调用流程中 do vfs ioctl 会处理一些内核自定义的cmd type 如果我们自定义的cmd type和系统定义的重复 会导致 该自
  • SQL 测试

    您的回答 1 SQL 指的是 您的回答 Structured Query Language 2 哪个 SQL 语句用于从数据库中提取数据 您的回答 SELECT 3 哪条 SQL 语句用于更新数据库中的数据 您的回答 UPDATE 4 哪条
  • LintCode之128 哈希函数

    题目来源 哈希函数 题目描述 在数据结构中 哈希函数是用来将一个字符串 或任何其他类型 转化为小于哈希表大小且大于等于零的整数 一个好的哈希函数可以尽可能少地产生冲突 一种广泛使用的哈希函数算法是使用数值33 假设任何字符串都是基于33的一
  • 一文解释python中的实例方法,类方法和静态方法作用和区别是啥?该如何使用

    我们都知道 python类中有三种常见的方法 分别是实例方法 类方法和静态方法 那么这几个方法到底有什么作用 它们之间有什么区别 该如何使用 带着这些问题 下面我们就来了解下这三种方法 1 方法介绍 2 代码说明 若我们要实现一个学生的类
  • ==,Object.equals(), Objects.equals(), Objects.deepEquals 使用注意

    相等判断时需注意 基本数据类型之间 可使用 包装类型之间尽量不要使用 包装类数值超过 127 128 引用类型地址不同 在 127 128之间时 翻阅底层源码发现 使用的是缓存的值 使用Object equals 做内容比较时 把常量 或可
  • IM即时通讯实现原理

    即时通讯 Instant Messenger 简称IM 软件多是基于TCP IP和UDP进行通讯的 TCP IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议 前 者是以数据流的形式 将传输数据经分割 打包后 通过两台机器之间建立起