gpt4 book ai didi

ios - 套接字未在 iOS Swift 中连接?

转载 作者:行者123 更新时间:2023-12-01 16:01:26 24 4
gpt4 key购买 nike

我尝试使用套接字连接服务器,但它拒绝连接。在这里,我试图发送带有基本 URL 的查询参数( token )以连接服务器。但是,它仍然没有连接。

这是控制台输出错误:

manager  <SocketIO.SocketManager: 0x283542f00>
2020-01-23 17:59:12.872248+0530 A8FlowSampleApp[34442:7736351] LOG SocketIOClient{/}: Handling event: statusChange with data: [connecting, 2]
2020-01-23 17:59:12.872415+0530 A8FlowSampleApp[34442:7736351] LOG SocketIOClient{/}: Joining namespace /
2020-01-23 17:59:12.872543+0530 A8FlowSampleApp[34442:7736351] LOG SocketManager: Tried connecting socket when engine isn't open. Connecting
2020-01-23 17:59:12.872621+0530 A8FlowSampleApp[34442:7736351] LOG SocketManager: Adding engine
2020-01-23 17:59:12.873836+0530 A8FlowSampleApp[34442:7736455] LOG SocketEngine: Starting engine. Server: https://base url/event-stream/
2020-01-23 17:59:12.874735+0530 A8FlowSampleApp[34442:7736455] LOG SocketEngine: Handshaking
2020-01-23 17:59:13.452879+0530 A8FlowSampleApp[34442:7736457] ERROR SocketEngine: Invalid HTTP upgrade. code=404, type=upgradeError
2020-01-23 17:59:13.455416+0530 A8FlowSampleApp[34442:7736351] LOG SocketIOClient{/}: Handling event: websocketUpgrade with data: [["server": "nginx/1.17.4", "strict-transport-security": "max-age=31536000; includeSubDomains; preload", "content-length": "153", "vary": "Accept-Encoding", "content-type": "text/html", "connection": "keep-alive", "date": "Thu, 23 Jan 2020 12"]]
2020-01-23 17:59:13.455832+0530 A8FlowSampleApp[34442:7736351] ERROR SocketManager: Invalid HTTP upgrade. code=404, type=upgradeError
2020-01-23 17:59:13.456085+0530 A8FlowSampleApp[34442:7736351] LOG SocketIOClient{/}: Handling event: error with data: ["Invalid HTTP upgrade. code=404, type=upgradeError"]
2020-01-23 17:59:13.456546+0530 A8FlowSampleApp[34442:7736351] LOG SocketManager: Starting reconnect
2020-01-23 17:59:13.456796+0530 A8FlowSampleApp[34442:7736351] LOG SocketManager: Trying to reconnect
2020-01-23 17:59:13.457076+0530 A8FlowSampleApp[34442:7736351] LOG SocketIOClient{/}: Handling event: reconnectAttempt with data: [100]
2020-01-23 17:59:13.457298+0530 A8FlowSampleApp[34442:7736351] LOG SocketManager: Adding engine
2020-01-23 17:59:13.458324+0530 A8FlowSampleApp[34442:7736351] LOG SocketEngine: Engine is being released
2020-01-23 17:59:13.460873+0530 A8FlowSampleApp[34442:7736351] LOG SocketManager: Scheduling reconnect in 20.375904394158646s

这是套接字代码:

import Foundation
import UIKit
import SocketIO

class SocketIOManager: NSObject {
static let shared = SocketIOManager()

static let authToken = UserDefaults.standard.string(forKey: "authToken")
static let bearerToken: String = "?token=Bearer " + (authToken ?? "")
static let newBaseURL = UserDefaults.standard.string(forKey: "baseURL")!
//static let v = newBaseURL + "/event-stream/?token=\(bearerToken)"

static let v = newBaseURL + "/event-stream/"

var socket: SocketIOClient!

// defaultNamespaceSocket and swiftSocket both share a single connection to the server
let manager = SocketManager(socketURL: URL(string: v)!, config: [.log(true), .compress, .path("?token=\(bearerToken)")])

override init() {
super.init()

socket = manager.defaultSocket
}

func connectSocket() {
print("manager ", manager)

self.manager.config = SocketIOClientConfiguration(
arrayLiteral: .secure(true), .log(true), .forceNew(true), .reconnects(true), .reconnectAttempts(100), .forceWebsockets(true)
)
socket.connect()
}

func receiveMsg() {
socket.on("chatevent") { (dataArray, ack) in
print(dataArray.count)
}
}
}//class

如何连接套接字并从服务器接收消息?

编辑版本:

 import SocketIO


class SocketIOManager: NSObject {




open class SocketConnection {

public static let default_ = SocketConnection()
let manager: SocketManager
public init() {


let authToken = UserDefaults.standard.string(forKey: "authToken")
let bearerToken: String = authToken ?? ""
let param:[String:Any] = ["token": "Bearer " + bearerToken]
let route = "/event-stream/"

let socketURL: URL = Utility().URLforRoute(route: route, params: param)! as URL
manager = SocketManager(socketURL: socketURL, config: [.log(true), .compress, .forcePolling(false), .forceNew(true), .reconnects(true), .reconnectAttempts(100), .forceWebsockets(true)])
manager.config = SocketIOClientConfiguration(arrayLiteral: .connectParams(param), .secure(true))
}
}
public func connectSocket(){
let socket = SocketConnection.default_.manager.defaultSocket
if socket.status != .connected{
socket.connect()
}
socket.on(clientEvent: .connect) {data, ack in

print(data)
print(ack)
print("socket connected")
// self.getFinishAcknowledgement()
}
socket.on(clientEvent: .disconnect) {data, ack in

}
socket.on("unauthorized") { (data, ack) in
print(data)
print(ack)
print("unauthorized user")
}

socket.on("chatevent") { (dataArray, ack) in

print(dataArray.count)

}
}
private func disconnectSocket(){
let socket = SocketConnection.default_.manager.defaultSocket
socket.disconnect()
}


}


extension NSObject {

func URLforRoute(route: String,params:[String: Any]) -> NSURL? {



let newBaseURL = UserDefaults.standard.string(forKey: "baseURL")!
//static let v = newBaseURL + "/event-stream/?token=\(bearerToken)"

let v = newBaseURL

if let components: NSURLComponents = NSURLComponents(string: (v+route)){
var queryItems = [NSURLQueryItem]()
for(key,value) in params {
queryItems.append(NSURLQueryItem(name:key,value: "\(value)"))
}
components.queryItems = queryItems as [URLQueryItem]?
return components.url as NSURL?
}
return nil
}

@objc class Utility: NSObject{
static let main = Utility()
fileprivate override init() {}


}


}

最佳答案

我使用 pod SocketIO 连接并从服务器接收消息,这工作正常。

这里是要安装的pod,

pod 'Socket.IO-Client-Swift', '~> 15.1.0'

import SocketIO


class SocketIOManager: NSObject {

open class SocketConnection {

public static let default_ = SocketConnection()
let manager: SocketManager
private init() {
let param:[String:Any] = [:]
let route = "YOUR_ROUTE"
let socketURL: URL = Utility.URLforRoute(route: route, params: param)! as URL
manager = SocketManager(socketURL: socketURL, config: [.log(true), .compress])
manager.config = SocketIOClientConfiguration(arrayLiteral: .connectParams(param), .secure(true))
}
}
private func connectSocket(){
let socket = SocketConnection.default_.manager.defaultSocket
if socket.status != .connected{
socket.connect()
}
socket.on(clientEvent: .connect) {data, ack in

print(data)
print(ack)
print("socket connected")
self.getFinishAcknowledgement()
}
socket.on(clientEvent: .disconnect) {data, ack in

}
socket.on("unauthorized") { (data, ack) in
print(data)
print(ack)
print("unauthorized user")
}
}
private func disconnectSocket(){
let socket = SocketConnection.default_.manager.defaultSocket
socket.disconnect()
}
private func emitLatLng(){
let socket = SocketConnection.default_.manager.defaultSocket
if socket.status != .connected{return}
let params:[String:Any] = ["lat":"lat","lng":"lng","rideId":"rideId"] as Dictionary
print(params)
socket.emitWithAck("Acknowledgement", params).timingOut(after: 5) {data in
print(data)
}
}
private func emitEndRide(){
let socket = SocketConnection.default_.manager.defaultSocket
let param:[String:Any] = ["rideId":"rideId"] as Dictionary
socket.emitWithAck("Acknowledgement", param).timingOut(after: 5) {data in
print(data)
}
}
private func getFinishAcknowledgement(){
let socket = SocketConnection.default_.manager.defaultSocket
socket.on("Acknowledgement") {data, ack in
print(data)
socket.disconnect()
}
}
}

查询参数的函数:

extension Utility{
static func URLforRoute(route: String,params:[String: Any]) -> NSURL? {
if let components: NSURLComponents = NSURLComponents(string: route){
var queryItems = [NSURLQueryItem]()
for(key,value) in params {
queryItems.append(NSURLQueryItem(name:key,value: "\(value)"))
}
components.queryItems = queryItems as [URLQueryItem]?
return components.url as NSURL?
}
return nil
}
}

对于 Utility,添加:

@objc class Utility: NSObject{
static let main = Utility()
fileprivate override init() {}
}

然后扩展实用程序并在该扩展中添加上面的函数“URLForRoute”。

代码中的更改:

之前

let authToken = UserDefaults.standard.string(forKey: "authToken")
let bearerToken: String = "Bearer " + (authToken ?? "")
let param:[String:Any] = ["token": bearerToken]

之后

let authToken = UserDefaults.standard.string(forKey: "authToken")
let bearerToken: String = authToken ?? ""
let param:[String:Any] = ["Authorization": bearerToken]

关于ios - 套接字未在 iOS Swift 中连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59880306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com