簡體   English   中英

iOS WebSocket連接即時斷開

[英]iOS websocket connection instant disconnects

我正在嘗試在iOS客戶端(iPad Air 2)和我的C#服務器之間建立Websocket連接。

在iOS上,我使用Starscream( https://github.com/daltoniam/Starscream )進行websocket連接。 但是,在我成功連接到服務器之后,它會自動斷開連接。 Sec-WebSocket-Accept雙方都相同。 我猜該錯誤在我的C#服務器中,但是我無法弄清楚到底是什么錯誤。

這是我的iOS代碼:

class ViewController: UIViewController {

var socket : WebSocket!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    socket = WebSocket(url: URL(string: "ws://192.168.188.35:80")!)
    socket.connect()
    socket.pongDelegate = self
    socket.advancedDelegate = self

}


deinit {
    socket.disconnect(forceTimeout: 0, closeCode: 0)
    socket.delegate = nil
}

}

extension ViewController: WebSocketAdvancedDelegate {
func websocketDidConnect(socket: WebSocket) {
    print("connect")
}

func websocketDidDisconnect(socket: WebSocket, error: Error?) {
    print("disconnect")
}

func websocketDidReceiveMessage(socket: WebSocket, text: String, response: WebSocket.WSResponse) {
    print("receivedMessage")
}

func websocketDidReceiveData(socket: WebSocket, data: Data, response: WebSocket.WSResponse) {
    print("receivedData")
}

func websocketHttpUpgrade(socket: WebSocket, request: String) {
    print("httpUpgradeRequest")
    print(request)
}

func websocketHttpUpgrade(socket: WebSocket, response: String) {
    print("httpUpgradeResponse")
    print(response)
}

}

這是我的C#服務器:

public TcpListener server;

    public MainWindow()
    {
        server = new TcpListener(IPAddress.Parse("192.168.188.35"), 80);

        server.Start();
        Console.WriteLine("Server has started on 127.0.0.1:80.{0}Waiting for a connection...", Environment.NewLine);

        TcpClient client = server.AcceptTcpClient();

        Console.WriteLine("A client connected.");

        NetworkStream stream = client.GetStream();


        while (client.Available < 3)
        {
            // wait for enough bytes to be available
        }

        Byte[] bytes = new Byte[client.Available];

        stream.Read(bytes, 0, bytes.Length);

        //translate bytes of request to string
        String data = Encoding.UTF8.GetString(bytes);

        if (Regex.IsMatch(data, "^GET"))
        {
            const string eol = "\r\n"; // HTTP/1.1 defines the sequence CR LF as the end-of-line marker

            Byte[] response = Encoding.UTF8.GetBytes("HTTP/1.1 101 Switching Protocols" + eol
                + "Connection: Upgrade" + eol
                + "Upgrade: websocket" + eol
                + "Sec-WebSocket-Accept: " + Convert.ToBase64String(
                    System.Security.Cryptography.SHA1.Create().ComputeHash(
                        Encoding.UTF8.GetBytes(
                            new System.Text.RegularExpressions.Regex("Sec-WebSocket-Key: (.*)").Match(data).Groups[1].Value.Trim() + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
                        )
                    )
                ) + eol
                + eol);

            stream.Write(response, 0, response.Length);
        }
        else
        {

        }

    }

您所需要的只是一個監聽循環。 因為這是自上而下的執行,所以在編寫響應后,tcp客戶端偵聽器將停止。 您可以查看此實現https://docs.microsoft.com/zh-cn/dotnet/api/system.net.sockets.tcplistener?view=netframework-4.7.2

我發現了問題,它在我的C#服務器內部:連接了客戶端並且握手成功后,您必須致電

server.AcceptSocket(); //or server.AcceptSocketAsync()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM