我正在使用正确的 WebSocketHandler() 运行 Spring Boot v2.2。我确信服务器是正确的,因为当我访问http://websocket.org/echo.html并尝试连接到我们的服务器时,我们可以验证服务器和浏览器客户端上的连接。
但是,在 iOS 中(我在 2 个模拟器上进行测试 - iOS 12 和 iOS 13.3),我无法连接。我现在正在尝试使用红蜘蛛。(尝试使用 Socket.io 会导致无法解决的问题,而尝试使用 SocketRocket 会导致问题只是让它在 iOS 13.3 上构建。)
我现在面临的问题是,Starscream 在尝试连接到我们的 java 服务器的地址(ws://127.0.0.1:8080/socket)时只是默默地失败了。当我说静默失败时,我的意思是客户端或服务器上没有任何反应表明存在错误,但通过调试我可以看到我们的 iOS 套接字上的 isConnected = false 。
为了尝试解决此问题,我尝试过:
- 添加
App Transport Security Settings -> Allow Arbitrary Loads = YES
Info.plist。 - 添加
NSExceptionDomains -> NSExceptionAllowsInsecureHTTPLoads = YES
Info.plist。 - 同时使用 localhost 和 127.0.0.1,同时使用
/socket
or/
和 HTTP 而不是 ws/wss。 - 我什至能够使用原生 Swift 通过 GET 请求有效地查询 google.com。
import Foundation
import Starscream
class WinkNetworkClient : WebSocketDelegate {
private var isConnected : Bool = false
init() {
let socket: WebSocket =
WebSocket(request:
URLRequest(url: URL(string: "ws://127.0.0.1:8080/socket")!), certPinner: FoundationSecurity(allowSelfSigned: true))
socket.delegate = self
socket.connect()
// socket.write(string: "Hi Server!")
print("Client done")
}
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 .viabilityChanged(_):
break
case .reconnectSuggested(_):
break
case .cancelled:
isConnected = false
case .error(let error):
isConnected = false
print("error connecting to websocket: \(String(describing: error))")
}
}
}
我对问题可能是什么感到非常迷茫。我究竟做错了什么?