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 服务器的主要内容,如果未能解决你的问题,请参考以下文章