iOS-今天,我们来聊一聊WebSocket
前言:
前段时间,在公司的项目中用到了WebSocket
,当时没有时间好好整理。
最近,趁着有时间,就好好梳理了一下WebSocket
的相关知识。
本篇将介绍以下内容:
1、什么是WebSocket
?
2、WebSocket
使用场景
3、WebSocket
底层原理(协议)
4、iOS
中WebSocket
的相关框架
5、使用Starscream
(Swift
)完成长链需求( 客户端 )
6、使用Golang
完成长链需求( 服务端 )
一、什么是 WebSocket ?
WebSocket = “HTTP第1次握手” + TCP
的“全双工“通信 的网络协议。
主要过程:
- 首先,通过
HTTP
第一次握手保证连接成功。 - 其次,再通过
TCP
实现浏览器与服务器全双工(full-duplex
)通信。(通过不断发ping
包、pang
包保持心跳)
最终,使得 “服务端” 拥有 “主动” 发消息给 “客户端” 的能力。
这里有几个重点:
WebSocket
是基于TCP
的上部应用层网络协议。- 它依赖于
HTTP
的第一次握手成功 + 之后的TCP
双向通信。
二、WebSocket 应用场景
1. IM(即时通讯)
典型例子:微信、QQ等 当然,用户量如果非常大的话,仅仅依靠WebSocket
肯定是不够的,各大厂应该也有自己的一些优化的方案与措施。但对于用户量不是很大的即时通讯需求,使用WebSocket
是一种不错的方案。
2. 游戏(多人对战)
典型例子:王者荣耀等(应该都玩过)
3. 协同编辑(共享文档)
多人同时编辑同一份文档时,可以实时看到对方的操作。 这时,就用上了WebSocket
。
4. 直播/视频聊天
对音频/视频需要较高的实时性。
5. 股票/基金等金融交易平台
对于股票/基金的交易来说,每一秒的价格可能都会发生变化。
6. IoT(物联网 / 智能家居)
例如,我们的App需要实时的获取智能设备的数据与状态。 这时,就需要用到WebSocket
。
...... 等等等等
只要是一些对 “实时性” 要求比较高的需求,可能就会用到WebSocket
。
三、WebSocket 底层原理
WebSocket
是一个网络上的应用层协议,它依赖于HTTP
协议的第一次握手,握手成功后,数据就通过TCP/IP
协议传输了。
WebSocket
分为握手阶段和数据传输阶段,即进行了HTTP
一次握手 + 双工的TCP
连接。
1、握手阶段
首先,客户端发送消息:(本例是:用Golang
编写的本地服务)
GET /chat HTTP/1.1
Host: 127.0.0.1:8000
Origin: ws://127.0.0.1:8000
Qi-WebSocket-Version: 0.0.1
Sec-WebSocket-Version: 13
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: aGFjb2hlYW9rd2JtdmV5eA==
复制代码
然后,服务端返回消息:(本例是:用swift
编写的客户端接收)
"Upgrade": "websocket",
"Connection": "Upgrade",
"Sec-WebSocket-Accept": "NO+pj7z0cvnNj//mlwRuAnCYqCE="
复制代码
这里值得注意的是Sec-WebSocket-Accept
的计算方法: base64(hsa1(sec-websocket-key + 258EAFA5-E914-47DA-95CA-C5AB0DC85B11))
- 如果这个
Sec-WebSocket-Accept
计算错误,浏览器会提示:Sec-WebSocket-Accept dismatch
; - 如果返回成功,
Websocket
就会回调onopen
事件
2、传输阶段
WebSocket
是以 frame
的形式传输数据的。 比如会将一条消息分为几个frame
,按照先后顺序传输出去。
这样做会有几个好处:
- 较大的数据可以分片传输,不用考虑到数据大小导致的长度标志位不足够的情况。
- 和
HTTP
的chunk
一样,可以边生成数据边传递消息,即提高传输效率。
WebSocket
传输过程使用的报文,如下所示:
0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-------+-+-------------+-------------------------------+|F|R|R|R| opcode|M| Payload len | Extended payload length ||I|S|S|S| (4) |A| (7) | (16/64) ||N|V|V|V| |S| | (if payload len==126/127) || |1|2|3| |K| | |+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +| Extended payload length continued, if payload len == 127 |+ - - - - - - - - - - - - - - - +-------------------------------+| |Masking-key, if MASK set to 1 |+-------------------------------+-------------------------------+| Masking-key (continued) | Payload Data |+-------------------------------- - - - - - - - - - - - - - - - +: Payload Data continued ... :+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +| Payload Data continued ... |+---------------------------------------------------------------+
复制代码
具体的参数说明如下:
FIN(1 bit): 表示信息的最后一帧,flag,也就是标记符。 PS:当然第一个消息片断也可能是最后的一个消息片断;
RSV1、RSV2、RSV3(均为1 bit): 默认均为0。如果有约定自定义协议则不为0,一般均为0。(协议扩展用)
Opcode(4 bit): 定义有效负载数据,如果收到了一个未知的操作码,连接也必须断掉,以下是定义的操作码:
操作码 | 含义 |
---|---|
%x0 | 连续消息片断 |
%x1 | 文本消息片断 |
%x2 | 二进制消息片断 |
%x3-7 | (预留位)为将来的非控制消息片断保留的操作码。 |
%x8 | 连接关闭 |
%x9 | 心跳检查ping |
%xA | 心跳检查pong |
%xB-F | (预留位)为将来的控制消息片断的保留操作码。 |
Mask(1 bit): 是否传输数据添加掩码。 若为1,掩码必须放在masking-key区域。(后面会提到..) 注:客户端给服务端发消息
Mask
值均为1
。Payload length: Payload字段用来存储传输数据的长度。
本身Payload报文字段的大小可能有三种情况:7 bit
、7+16 bit
、7+64 bit
。
第一种:7 bit
,表示从0000000
~ 1111101
(即0
~125
),表示当前数据的length大小(较小数据,最大长度为125)。
第二种:(7+16) bit
:前7位为1111110(即126)
,126
代表后面会跟着2个字节无符号数,用来存储数据length大小(长度最小126,最大为65 535)。
第三种:(7+64) bit
:前7位为1111111(即127)
,127
代表后面会跟着8个字节无符号数,用来存储数据length大小(长度最小为65536,最大为2^16-1)。
Payload报文长度 | 所传输的数据大小区间 |
---|---|
7 bit | [ 0, 125] |
7 +16 bit | [ 126 , 65535] |
7 + 64 bit | [ 65536, 2^16 -1] |
说明:
传输数据的长度,以字节的形式表示:7位、7+16位、或者7+64位。
1)如果这个值以字节表示是0-125这个范围,那这个值就表示传输数据的长度;
2)如果这个值是126,则随后的2个字节表示的是一个16进制无符号数,用来表示传输数据的长度;
3)如果这个值是127,则随后的是8个字节表示的一个64位无符号数,这个数用来表示传输数据的长度。
Masking-key(0 bit / 4 bit):
0 bit
:说明mask值不为1
,无掩码。4 bit
:说明mask值为1
,添加掩码。PS:客户端发送给服务端数据时,
mask
均为1。 同时,Masking-key
会存储一个32位的掩码。Payload data(x+y byte): 负载数据为扩展数据及应用数据长度之和。
Extension data(x byte): 如果客户端与服务端之间没有特殊约定,那么扩展数据的长度始终为0,任何的扩展都必须指定扩展数据的长度,或者长度的计算方式,以及在握手时如何确定正确的握手方式。如果存在扩展数据,则扩展数据就会包括在负载数据的长度之内。
Application data(y byte): 任意的应用数据,放在扩展数据之后。
应用数据的长度 = 负载数据的长度 - 扩展数据的长度
即:Application data = Payload data - Extension data
四、iOS 中 WebSocket 相关框架
WebSocket(iOS客户端):
Starscream(swift): Websockets in swift for iOS and OSX.(
star 5k+
)SocketRocket(objective-c): A conforming Objective-C WebSocket client library.(
star:8k+
)SwiftWebSocket(swift): Fast Websockets in Swift for iOS and OSX.(
star:1k+
)
Socket(iOS客户端):
CocoaAsyncSocket: Asynchronous socket networking library for Mac and iOS.(
star:11k+
)socket.io-client-swift: Socket.IO-client for iOS/OS X.(
star:4k+
)
五、使用Starscream(swift)完成客户端长链需求
首先附上Starscream:GitHub地址
第一步:将Starsream
导入到项目。
打开Podfile
,加上:
pod 'Starscream', '~> 4.0.0'
复制代码
接着pod install
。
第二步:实现WebSocket能力。
导入头文件,
import Starscream
初始化
WebSocket
,把一些请求头包装一下(与服务端对好)
private func initWebSocket() {// 包装请求头var request = URLRequest(url: URL(string: "ws://127.0.0.1:8000/chat")!)request.timeoutInterval = 5 // Sets the timeout for the connectionrequest.setValue("some message", forHTTPHeaderField: "Qi-WebSocket-Header")request.setValue("some message", forHTTPHeaderField: "Qi-WebSocket-Protocol")request.setValue("0.0.1", forHTTPHeaderField: "Qi-WebSocket-Version")request.setValue("some message", forHTTPHeaderField: "Qi-WebSocket-Protocol-2")socketManager = WebSocket(request: request)socketManager?.delegate = self
}
复制代码
同时,我用三个Button的点击事件,分别模拟了connect(连接)、write(通信)、disconnect(断开)。
// Mark - Actions// 连接@objc func connetButtonClicked() {socketManager?.connect()}// 通信@objc func sendButtonClicked() {socketManager?.write(string: "some message.")}// 断开@objc func closeButtonCliked() {socketManager?.disconnect()}
复制代码
第三步:实现WebSocket回调方法(接收服务端消息)
遵守并实现WebSocketDelegate
。
extension ViewController: WebSocketDelegate {// 通信(与服务端协商好)func didReceive(event: WebSocketEvent, client: WebSocket) {switch event {case .connected(let headers):isConnected = trueprint("websocket is connected: \(headers)")case .disconnected(let reason, let code):isConnected = falseprint("websocket is disconnected: \(reason) with code: \(code)")case .text(let string):print("Received text: \(string)")case .binary(let data):print("Received data: \(data.count)")case .ping(_):breakcase .pong(_):breakcase .viablityChanged(_):breakcase .reconnectSuggested(_):breakcase .cancelled:isConnected = falsecase .error(let error):isConnected = false// ...处理异常错误print("Received data: \(String(describing: error))")}}
}
复制代码
分别对应的是:
public enum WebSocketEvent {case connected([String: String]) //!< 连接成功case disconnected(String, UInt16) //!< 连接断开case text(String) //!< string通信case binary(Data) //!< data通信case pong(Data?) //!< 处理pong包(保活)case ping(Data?) //!< 处理ping包(保活)case error(Error?) //!< 错误case viablityChanged(Bool) //!< 可行性改变case reconnectSuggested(Bool) //!< 重新连接case cancelled //!< 已取消
}
复制代码
这样一个简单的客户端WebSocket demo
就算完成了。
- 客户端成功,日志截图:
六、使用Golang完成简单服务端长链需求
仅仅有客户端也无法验证WebSocket
的能力。
因此,接下来我们用Golang
简单做一个本地的服务端WebSocket
服务。
PS:最近,正好在学习
Golang
,参考了一些大神的作品。
直接上代码了:
package mainimport ("crypto/sha1""encoding/base64""errors""io""log""net""strings"
)func main() {ln, err := net.Listen("tcp", ":8000")if err != nil {log.Panic(err)}for {log.Println("wss")conn, err := ln.Accept()if err != nil {log.Println("Accept err:", err)}for {handleConnection(conn)}}
}func handleConnection(conn net.Conn) {content := make([]byte, 1024)_, err := conn.Read(content)log.Println(string(content))if err != nil {log.Println(err)}isHttp := false// 先暂时这么判断if string(content[0:3]) == "GET" {isHttp = true}log.Println("isHttp:", isHttp)if isHttp {headers := parseHandshake(string(content))log.Println("headers", headers)secWebsocketKey := headers["Sec-WebSocket-Key"]// NOTE:这里省略其他的验证guid := "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"// 计算Sec-WebSocket-Accepth := sha1.New()log.Println("accept raw:", secWebsocketKey+guid)io.WriteString(h, secWebsocketKey+guid)accept := make([]byte, 28)base64.StdEncoding.Encode(accept, h.Sum(nil))log.Println(string(accept))response := "HTTP/1.1 101 Switching Protocols\r\n"response = response + "Sec-WebSocket-Accept: " + string(accept) + "\r\n"response = response + "Connection: Upgrade\r\n"response = response + "Upgrade: websocket\r\n\r\n"log.Println("response:", response)if lenth, err := conn.Write([]byte(response)); err != nil {log.Println(err)} else {log.Println("send len:", lenth)}wssocket := NewWsSocket(conn)for {data, err := wssocket.ReadIframe()if err != nil {log.Println("readIframe err:", err)}log.Println("read data:", string(data))err = wssocket.SendIframe([]byte("good"))if err != nil {log.Println("sendIframe err:", err)}log.Println("send data")}} else {log.Println(string(content))// 直接读取}
}type WsSocket struct {MaskingKey []byteConn net.Conn
}func NewWsSocket(conn net.Conn) *WsSocket {return &WsSocket{Conn: conn}
}func (this *WsSocket) SendIframe(data []byte) error {// 这里只处理data长度<125的if len(data) >= 125 {return errors.New("send iframe data error")}lenth := len(data)maskedData := make([]byte, lenth)for i := 0; i < lenth; i++ {if this.MaskingKey != nil {maskedData[i] = data[i] ^ this.MaskingKey[i%4]} else {maskedData[i] = data[i]}}this.Conn.Write([]byte{0x81})var payLenByte byteif this.MaskingKey != nil && len(this.MaskingKey) != 4 {payLenByte = byte(0x80) | byte(lenth)this.Conn.Write([]byte{payLenByte})this.Conn.Write(this.MaskingKey)} else {payLenByte = byte(0x00) | byte(lenth)this.Conn.Write([]byte{payLenByte})}this.Conn.Write(data)return nil
}func (this *WsSocket) ReadIframe() (data []byte, err error) {err = nil//第一个字节:FIN + RSV1-3 + OPCODEopcodeByte := make([]byte, 1)this.Conn.Read(opcodeByte)FIN := opcodeByte[0] >> 7RSV1 := opcodeByte[0] >> 6 & 1RSV2 := opcodeByte[0] >> 5 & 1RSV3 := opcodeByte[0] >> 4 & 1OPCODE := opcodeByte[0] & 15log.Println(RSV1, RSV2, RSV3, OPCODE)payloadLenByte := make([]byte, 1)this.Conn.Read(payloadLenByte)payloadLen := int(payloadLenByte[0] & 0x7F)mask := payloadLenByte[0] >> 7if payloadLen == 127 {extendedByte := make([]byte, 8)this.Conn.Read(extendedByte)}maskingByte := make([]byte, 4)if mask == 1 {this.Conn.Read(maskingByte)this.MaskingKey = maskingByte}payloadDataByte := make([]byte, payloadLen)this.Conn.Read(payloadDataByte)log.Println("data:", payloadDataByte)dataByte := make([]byte, payloadLen)for i := 0; i < payloadLen; i++ {if mask == 1 {dataByte[i] = payloadDataByte[i] ^ maskingByte[i%4]} else {dataByte[i] = payloadDataByte[i]}}if FIN == 1 {data = dataBytereturn}nextData, err := this.ReadIframe()if err != nil {return}data = append(data, nextData...)return
}func parseHandshake(content string) map[string]string {headers := make(map[string]string, 10)lines := strings.Split(content, "\r\n")for _, line := range lines {if len(line) >= 0 {words := strings.Split(line, ":")if len(words) == 2 {headers[strings.Trim(words[0], " ")] = strings.Trim(words[1], " ")}}}return headers
}
复制代码
完成后,在本地执行:
go run WebSocket_demo.go
复制代码
即可开启本地服务。
这时候访问ws://127.0.0.1:8000/chat
接口,即可调用长链服务。
- 服务端,成功日志截图:
相关参考链接:
《微信,QQ这类IM app怎么做——谈谈Websocket》(冰霜大佬)
《WebSocket的实现原理》
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- PMP十个常见问题汇总
什么是PMP?PMP指的是项目管理专业人士资格认证。它是由美国管理项目协会(Project Management Institute(PMI)发起的,严格评估管理项目人员知识技能是否具有高品质的资格认证考试。目前全世界190多个国家和地区设立了认证考试机构。是目前项目管理领域含金量最高的认证。获…...
2024/5/10 9:06:53 - ftp工具绿色版,带你了解ftp工具绿色版是什么
说起好用的ftp下载工具绿色版,就不得不提iis7服务器管理工具了,它不仅仅能批量管理ftp站点,同时还能问完成定时上传和下载,还是一款免费的软件。 除了兼顾ftp下载工具绿色版的客户端,iis7服务器管理工具还具有着能批量管理Winduws、Linux系列系统和VNC的强大功能,绝对是运…...
2024/4/18 4:11:38 - 学了python不知干啥?爬爬虫! (3)爬取豆瓣书籍列表(bs4/lxml简单使用)
爬取豆瓣书籍列表合理爬取,不随意扩大站点压力 本文章仅作示例,请勿用作非法用途该系列的其他篇目:(1)爬取网络图片 (2)爬取网络小说全本并保存本篇目录效果开始试爬取UA伪装解析数据BeautifulSoup4安装使用使用lxml安装结合bs4使用完整源码其他后续 效果解析豆瓣书籍列…...
2024/4/21 11:51:27 - 电源部分测试
主要分6部分测试: 1、 电源电路; 2、 后级功放测试; 3、 高低频测试; 4、 四选一测试; 5、 音量调节的继电器模块测试; 6、 正弦波发生器测试(包括单片机最小核心板)。 电源电路: 首先做出电源电路,给其他电路使用。不然要用直流稳压电源(后面讲到用直流稳压电源,如…...
2024/4/20 10:04:24 - 公钥私钥理解
参考文章:https://blog.csdn.net/21aspnet/article/details/72494011、公钥加密,私钥解密2、私钥签名,公钥验签备注:公钥加密,公钥不能解密。...
2024/5/10 7:38:32 - Nmap常用命令总结+实操
1. nmap -sT 192.168.96.4 //TCP连接扫描,不安全,慢...
2024/5/1 12:54:17 - (毕业真实)版本《USYD文Q凭3527750781(毕业真实)版本《悉尼大学毕业证】真实一样证书The University of Sydney
(毕业真实)版本《USYD文Q凭3527750781(毕业真实)版本《悉尼大学毕业证】真实一样证书The University of Sydney...
2024/4/16 3:05:09 - Cts问题之android.view.cts.SurfaceViewSyncTests(测试案例:CtsViewTestCases)
不积跬步无以至千里这个CTS的bug说实话耽误了很长时间,并且最后的这个解决方式也是巧妙避过。(这个项目的手机屏幕宽度为:320,是比较小的手机)出现问题的bug为:1、CtsViewTestCases_android.view.cts.SurfaceViewSyncTests#testSurfaceViewSmallScale2、CtsViewTestCases…...
2024/4/16 3:04:49 - iOS APP开发点滴系列之六使用故事板创建ScrollView
...
2024/5/10 5:08:22 - Git本地版本回退与远端版本回退
预备知识: 一个commit对应这一个版本,有一个commit id,40位的16进制数字,通过SHA1计算得到,不同的文件计算出来的SHA1值不同(有很小的几率相同,可忽略),这样每一个提交都有其独特的id。每提交一个新版本,实际上Git就会把它们自动串成一条时间线。 在Git中,HEAD表示当前…...
2024/4/16 3:05:24 - html/css 滚动到元素位置,显示加载动画
每次滚动到元素时,都显示加载动画,如何添加? 元素添加初始参数以上图中的动画为例,添加俩个左右容器,将内容放置在容器内部。添加初始数据,默认透明度0、左右分别移动100px。 //左侧容器.item-leftContainer {opacity: 0;transform: translateX(-100px);}//右侧容器.item…...
2024/5/10 6:45:42 - 关于视频流媒体服务器搭建后端302重定向的两种方式介绍
JAVA后端重定向用spring mvc 一般为return “redirect:/url” ,原生重定向为response.sendRedirect(“url”), 有时候spring mvc在重定向的时候会生成一个SESSIONID在浏览器的地址栏以url重写的方式出现,一般为JSESSIONID=***的格式,这时可以用原生重定向response.sendRedire…...
2024/4/16 3:04:59 - Android源码中添加高斯模糊背景-毛玻璃
不积跬步无以至千里 由于系统中多处使用了高斯模糊处理的背景效果,这里感觉也算一个有b格的设计,因此把实现记录下来,而且多数的处理是基于上层的添加方式,这里说一下源码下的整个流程.1.配置Android.mk配置其中所需要的库,以及RenderScript所依赖的环境LOCAL_STATIC_JAVA_L…...
2024/5/8 15:27:25 - Cts问题之备份问题(测试案例:CtsShortcutHostTestCases)
不积跬步无以至千里前边已经说了关于cts单项测试的流程,接下来说一下我遇到的这个关于系统备份功能的测试出现的bug。简单说下解CTS的小体会:1、先查看这个cts的bug是哪个测试案例的问题,如下面,我这个是CtsShortcutHostTestCases项测试的一个bug2、然后查找CTS的测试代码,…...
2024/5/10 9:55:05 - SQLAlchemy中时间和日期格式的查询,比较对象为字符串str
关键函数是func.time_format和func.date_format 包为from sqlalchemy.sql.functions import func或from sqlalchemy import funcbrush_data = session.query(RegisterOrder).filter(func.date_format(2020-03-21, "%Y-%m-%d") == func.date_format(RegisterOrder.tra…...
2024/4/16 3:05:04 - Android 系统开发小技巧
不积跬步无以至千里 1.杀死SystemUI进程,不用重启:adb shell ps | grep systemui | awk {print $2} | xargs -tl adb shell kill2.不能push文件(user-debug)adb rootadb disable-verityadb reboot 3.过滤查看进程信息(进程号的变化)adb shell ps | grep lanucher4.展讯…...
2024/4/18 19:40:55 - 编写自己的回调(Writing your own callbacks)
文章目录介绍设置Keras 回调概览回调方法概述全局方法批级的训练/测试/预测方法Epoch-level methods (training only)一个基本的例子logs字典的用法self.model属性的用法Keras回调应用程序示例以最小的损失Early stopping学习率安排内置Keras回调参考文献 介绍 回调是一种强大的…...
2024/4/1 3:01:55 - opencv Laplacian
以下代码完成Laplacian增强效果,opencv 实现void edgeEnhance(cv::Mat& srcImg, cv::Mat& dstImg) {if (!dstImg.empty()){dstImg.release();}cv::Mat srcImg8U;cv::Mat sharpMat8U;cv::Mat sharpMat;cv::Mat blurMat;srcImg.convertTo(srcImg8U, CV_8U);cv::Gaussian…...
2024/4/16 3:05:55 - 2015-2018车牌专利汇总与简要说明
北京邮电-一种基于类Haar特征和支持向量机的车牌字符识别方法主要步骤:求积分图,根据字符特色提取几种Haar特征,算特征与模板特征之间的相似度作为特征,用支持向量机进行分类。成都易默生-基于人工神经网络的车牌识别系统与方法主要特征:是一套车牌识别的系统,对ANN网络用…...
2024/4/16 3:06:05 - 关于Android Studio中编写源码中的跳转问题
不积跬步无以至千里在最新的项目中,按照往常一样编译完代码后,把源码导入了AndroidStudio(导入链接:https://blog.csdn.net/xiao_yuanjl/article/details/78687183),按照往常的流程,就开始编写了代码,但是发现了两个问题:问题一:点击某个类,跳转并不是我想去的类。问…...
2024/4/18 14:43:58
最新文章
- 【QT教程】QT6实时系统编程 QT实时系统
QT6实时系统编程 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免费…...
2024/5/10 10:48:39 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/9 21:23:04 - composer常见错误解决
在Java中,常见的问题和解决方法包括: 内存不足错误:Java应用程序在运行时可能会遇到内存不足的错误。可以通过增加JVM的堆内存大小来解决,可以通过设置-Xms和-Xmx参数来指定初始堆大小和最大堆大小。 java -Xms2G -Xmx4G YourAppl…...
2024/5/5 8:38:08 - c# wpf XmlDataProvider 简单试验
1.概要 2.代码 <Window x:Class"WpfApp2.Window12"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend…...
2024/5/10 0:12:52 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/8 6:01:22 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/9 15:10:32 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/9 4:20:59 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/7 11:36:39 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/8 20:48:49 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/7 9:26:26 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/8 19:33:07 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/8 20:38:49 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/10 10:22:18 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/9 17:11:10 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57