Socket.IO-Client-Swift 未连接到 nodejs socket.io 服务器

Posted

技术标签:

【中文标题】Socket.IO-Client-Swift 未连接到 nodejs socket.io 服务器【英文标题】:Socket.IO-Client-Swift does not connect to nodejs socket.io server 【发布时间】:2021-03-31 07:17:02 【问题描述】:

我需要你关于 ios 上的 Websocket 的帮助。

我正在尝试使用 Socket.IO-Client-Swift 从 iOS 客户端使用 Node.js 连接到 websocket 服务器,但似乎 Node.js websocket 服务器无法识别来自 iOS 客户端的访问。

/etc/nginx/conf.d/rsp.arakaki.app.conf

(nginx的配置文件)

Websocket 服务器在端口 3000 上运行,因此对 /socket.io/ 的请求将被代理到 upstream websocket (server localhost:3000;)。

upstream php-fpm 
  server localhost:9000;


upstream websocket 
  server localhost:3000;


server 
  server_name rsp.arakaki.app;

  listen 80;

  return 301 https://$host$request_uri;


server 
  server_name rsp.arakaki.app;

  listen 443 ssl;

  ssl_certificate /etc/letsencrypt/live/rsp.arakaki.app/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/rsp.arakaki.app/privkey.pem;

  root /var/www/rsp.arakaki.app/webroot;

  index index.php;

  location / 
    try_files $uri $uri/ /index.php?$args;
  

  location /socket.io/ 
    proxy_pass http://websocket;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $host;
  

  location ~ \.php$ 
    try_files $uri =404;
    include fastcgi_params;
    fastcgi_pass php-fpm;
    fastcgi_index index.php;
    fastcgi_intercept_errors on;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  

/var/www/rsp.arakaki.app/websocket/src/server.js

(websocket服务器源文件)

我想当 websocket 客户端成功连接到服务器时,websocket 服务器会记录一些消息。但我只能在使用 Web 客户端时看到消息。使用 iOS 客户端时看不到任何消息。

const fs = require("fs");

const express = require("express");

const app = express();

const http = require("http");

const server = http.createServer(app);

const io = require("socket.io")(server);

io.on("connection", (socket) => 
  console.log("a user connected");

  socket.on("disconnecting", (reason) => 
    console.log("user disconnecting",  reason );
  );

  socket.on("disconnect", (reason) => 
    console.log("user disconnected",  reason );
  );
);

server.listen(3000, () => 
  console.log("server running...");
);

MainViewController.swift

(iOS websocket 客户端)

Websocket 服务器不使用此代码记录任何内容。 我认为这是因为我成功从 Web 客户端连接到 iOS 客户端。 我不知道。

import UIKit
import SocketIO

class MainViewController: UIViewController 
    var manager: SocketManager!
    var socket: SocketIOClient!

    override func viewDidLoad() 
        super.viewDidLoad()

        manager = SocketManager(socketURL: URL(string: "https://rsp.arakaki.app/")!, config: [.log(true), .forceWebsockets(true)])
        socket = manager?.defaultSocket

        socket.on(clientEvent: .connect)  (data, ack) in
            print("socket connected")
            self.socket.emit("join", ["hoge"])
        

        socket.on(clientEvent: .error, callback:  (data, ack) in
            print("socket error")
        )

        socket.connect(timeoutAfter: 3, withHandler: 
            print("socket timeout")
        )
    

websocket.php

(Web 套接字客户端)

这个脚本运行良好。 Websocket 服务器记录为已连接。

<script src="https://rsp.arakaki.app/socket.io/socket.io.js"></script>
<script>
  var socket = io();
</script>

环境

CentOS 7 Nginx (1.18.0) Node.js (14.15.3) socket.io (3.0.4) 快递 (4.17.1) 斯威夫特 5 Socket.IO-Client-Swift (15.2.0) Xcode (12.3)

感谢您的关注。欢迎任何cmets。请帮帮我。

【问题讨论】:

【参考方案1】:

您的“Socket.IO-Client-Swift”版本是15.2,与socket.io服务器的3.0版本不兼容。

“客户端现在支持socket.io 3服务器。”写在“从v15升级到v16”指南:https://nuclearace.github.io/Socket.IO-Client-Swift/15to16.html

对于服务器 3.0 版本,您必须至少使用 v16,但尚未发布。可能它很快就会到来。 所以现在使用 socket.io 服务器的 2 版本是很好的解决方案。

您可以在以下链接查看 ios 客户端的版本标签:

https://github.com/socketio/socket.io-client-swift/tags

【讨论】:

【参考方案2】:

在我将 nodejs 服务器的 socket.io 库降级到版本 2.0.4 后,Socket.IO-Client-Swift 可以连接到服务器。谢谢。

【讨论】:

是的 nodejs 服务器端降级到 2.0.4 可以正常工作,谢谢。 已降级但仍无法正常工作。 iOS 15.2 和 SocketIO 服务器 2.0.4

以上是关于Socket.IO-Client-Swift 未连接到 nodejs socket.io 服务器的主要内容,如果未能解决你的问题,请参考以下文章

socket.io-client-swift 包解析在 Xcode13 Beta 项目中失败

Socket.io swift客户端自动多次重新连接

具有Swift 4依赖项的Swift 3 Cocoapod

Nextcloud 未连接到 Redis

ngrok 未连接到本地服务器

查尔斯调试代理未连接到本地主机