ClientServerStarscream(swift)Golang
一、使用Starscream(swift)完成客户端长链需求
首先附上Starscream:GitHub地址
Starsream
Podfile
pod 'Starscream', '~> 4.0.0'
pod install
第二步:实现WebSocket能力。
import StarscreamWebSocket
private func initWebSocket() {
// 包装请求头
var request = URLRequest(url: URL(string: "ws://127.0.0.1:8000/chat")!)
request.timeoutInterval = 5 // Sets the timeout for the connection
request.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 = true
print("websocket is connected: \(headers)")
case .disconnected(let reason, let code):
isConnected = false
print("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(_):
break
case .pong(_):
break
case .viablityChanged(_):
break
case .reconnectSuggested(_):
break
case .cancelled:
isConnected = false
case .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完成简单服务端长链需求
WebSocketGolangWebSocket
Golang
直接上代码了:
```go
package main
import (
"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 {