【问题标题】:How to use socketio with cordova hybrid app in production?如何在生产中使用 socketio 和 cordova 混合应用程序?
【发布时间】:2021-04-13 03:32:29
【问题描述】:

我之前在移动商店(Google 和 Apple)中构建并发布了非常简单的 AjAX/PHP 混合应用程序。现在我正在用socketio学习nodejs。我正在使用 socketio 进行bidirectional 通信(服务器到客户端和客户端到服务器)。我可以在指向 localhost 的开发机器上很好地使用它。

问题是:一旦应用部署在移动商店中,服务器应该如何与客户端通信?

在开发机器上很容易做到,因为它是本地的。在开发中,服务器和应用程序都在本地主机上。服务器在 3000 端口,客户端应用在 8000 端口运行。

无法“指向”商店中发布的应用。

这是我的简单应用,在所有设备和浏览器上进行本地测试时效果很好。

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/app.css">
<title>Myapp</title>
</head>
<body id="app" onload="onLoad()"></body>
</html>
<!--SCRIPTS-->
<script src="cordova.js"></script>
//point to localhost server
<script src="http://localhost:3000/socket.io/socket.io.js"></script>
<script src="js/app.js"></script>

app.js

// Wait for device API libraries to load
//
function onLoad() {
document.addEventListener("deviceready", onDeviceReady, false);
}

// device APIs are available
//
function onDeviceReady() {

//testing socket server
serverTest();

}

//testing socketio server
//see socket.js
//
function serverTest() {
var socket = io.connect('http://localhost:3000');

socket.on('connect', function() {
socket.on('text', function(text) {

//display data on page    
document.getElementById('app').innerHTML = text;

});
})
}

socket.js

 const path = require('path');
 const express = require('express');
 const app = express();
 const http = require('http');
 const server = http.createServer(app);

 const io = require('socket.io')(server, {
 cors: {
 origin: "http://localhost:8000",
 methods: ["GET", "POST"],
 allowedHeaders: ["my-custom-header"],
 credentials: true
 }
 });
 /**
  * 
  * use the following code to serve images, CSS files, and JavaScript files in a directory
  * https://expressjs.com/en/starter/static-files.html
  * 
  */
 app.use(express.static('js'));
 app.use(express.static('css'));
 
 //get
 app.get('/', (req, res,next) => {
 //...
 });
 
 io.on('connection', (socket) => {
 //console 
 console.log('user connected');

 //emitting event
 socket.emit('text', '<p class="serverTest">server and client are communicating </p>');
 
 });
 
 server.listen(3000, () => {
 console.log('listening on *:3000');
 });

【问题讨论】:

    标签: cordova socket.io


    【解决方案1】:

    一旦您投入生产,过程实际上是相同的,尽管您的套接字服务器是在外部托管的。

    一旦你启动并运行它,它应该像外部服务器一样工作

    因为您在评论中提到了 PM2,所以我更新了答案,还提到,如果您使用 PM2 来集群您的套接字服务器,您还需要查看 socket.io-redis 来管理集群中的套接字。

    根据您的用例,本主题可能会相当深入,并且需要额外的设置才能正常工作,尤其是当您需要访问套接字 ID 或获取跨集群连接的总套接字时。

    为了进一步阅读,我已经链接到我几天前回答的一个问题

    how to access socket session in all clusters

    【讨论】:

    • 我很尴尬。我认为它比这复杂得多,因为我必须使用 PM2 运行它。一样的,只是语言不同。逻辑。
    • 别这样 :) 去年我不得不深入研究这些东西,当时对我来说是全新的,并且有很多相同的问题.. 你在评论中提到了 PM2.. 这个实际上会引发一个转折,需要您使用 socket.io-redis 才能使集群模式工作,否则它会变得不稳定..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2019-05-30
    • 2015-07-13
    • 1970-01-01
    相关资源
    最近更新 更多