【发布时间】: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。请帮帮我。
【问题讨论】:
标签: ios node.js swift websocket socket.io