为啥 websocket 在使用代码 1000 响应本机打开后立即关闭。(iOS)

Posted

技术标签:

【中文标题】为啥 websocket 在使用代码 1000 响应本机打开后立即关闭。(iOS)【英文标题】:Why does websocket close immediately after open in react native with code 1000. (iOS)为什么 websocket 在使用代码 1000 响应本机打开后立即关闭。(iOS) 【发布时间】:2018-06-19 21:52:49 【问题描述】:

当我建立连接时,网络套接字立即关闭并显示代码 1000。有人可以告诉我为什么会发生这种情况吗?

这是我的简单代码:

let ws = new WebSocket("wss://myhost/my-path?param1=value1&param2=value2")

ws.onopen = () => console.log('OPEN')
ws.onclose = (e) => console.log('CLOSE: code: ' + e.code)
ws.onmessage = (e) => console.log('MESSAGE: ', e.data)
ws.onerror = () => console.log('ERROR')
// The result is:
// OPEN
// CLOSE: code: 1000

反应原生信息

$ react-native info

Environment:
  OS: macOS High Sierra 10.13.5
  Node: 8.9.4
  Yarn: 0.21.3
  npm: 5.7.1
  Watchman: 4.7.0
  Xcode: Xcode 9.4.1 Build version 9F2000
  android Studio: 3.1 AI-173.4720617

Packages: (wanted => installed)
  react: 16.3.1 => 16.3.1
  react-native: 0.55.4 => 0.55.4

【问题讨论】:

【参考方案1】:

如果客户端未完全发送标头,某些服务器会自动关闭连接。 WebSocket 的构造函数有第三个未记录的参数,可用于添加一些标头。 我只是添加了额外的标头,并且不再断开连接。

// In this case server doesn't close the connection.
let ws = new WebSocket("wss://myhost/my-path?param1=value1&param2=value2", null, 
    headers: 
      'Accept-Language': 'en,en-US;q=0.9,ru;q=0.8,de;q=0.7',
      'Cache-Control': 'no-cache',
      'Pragma': 'no-cache',
      'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/67.0.3396.87 Safari/537.36'
    
)

// In this case the server closes the connection.
let ws = new WebSocket("wss://myhost/my-path?param1=value1&param2=value2")

【讨论】:

以上是关于为啥 websocket 在使用代码 1000 响应本机打开后立即关闭。(iOS)的主要内容,如果未能解决你的问题,请参考以下文章

为啥当客户端断开连接时这个简单的 websocket 代码会抛出?

websocket 服务器怎么启动

为啥树莓派有源蜂鸣器高低电平都响

为啥客户端不接受我的 WebSocket 响应握手?

为啥我不能在函数中使用 websocket

无法连接到 WebSocket 服务器。不知道为啥