如何在生产中使用socketio和cordova hybrid应用程序?

如何在生产中使用socketio和cordova hybrid应用程序?,cordova,socket.io,Cordova,Socket.io,我曾经在移动商店(谷歌和苹果)中构建并发布过非常简单的AjAX/PHP混合应用程序。现在我正在学习socketio的nodejs。我使用socketio进行通信(服务器到客户端和客户端到服务器)。我能够在指向localhost的开发机器上很好地使用它 问题是:一旦应用部署到移动商店中,服务器应该如何与客户端通信 在开发机器上很容易做到,因为它是本地的。在开发过程中,服务器和应用程序都位于本地主机上。端口3000上的服务器和端口8000上运行的客户端应用程序 商店中发布的应用程序无法“指向” 这是

我曾经在移动商店(谷歌和苹果)中构建并发布过非常简单的AjAX/PHP混合应用程序。现在我正在学习socketio的nodejs。我使用socketio进行通信(服务器到客户端和客户端到服务器)。我能够在指向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>
socket.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;

});
})
}
 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');
 });
const path=require('path');
const express=require('express');
常量app=express();
const http=require('http');
const server=http.createServer(app);
const io=require('socket.io')(服务器{
cors:{
来源:“http://localhost:8000",
方法:[“获取”、“发布”],
AllowedHeader:[“我的自定义头”],
凭据:正确
}
});
/**
* 
*使用以下代码为目录中的图像、CSS文件和JavaScript文件提供服务
* https://expressjs.com/en/starter/static-files.html
* 
*/
app.use(express.static('js'));
app.use(express.static('css'));
//得到
app.get(“/”,(请求、恢复、下一步)=>{
//...
});
io.on('连接',(套接字)=>{
//控制台
console.log('user connected');
//发射事件
emit('text','

服务器和客户端正在通信; }); 服务器。听(3000,()=>{ console.log('监听*:3000'); });


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

一旦启动并运行它,它的工作原理应该与外部服务器相同

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

根据您的用例,本主题可能会涉及相当深入的内容,并且需要额外的设置才能正常工作,特别是当您需要访问套接字ID或跨集群连接全部套接字时

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


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

一旦启动并运行它,它的工作原理应该与外部服务器相同

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

根据您的用例,本主题可能会涉及相当深入的内容,并且需要额外的设置才能正常工作,特别是当您需要访问套接字ID或跨集群连接全部套接字时

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


我很尴尬。我认为它比那复杂得多,因为我必须用PM2来运行它。同样的事情,只是不同的语言。合乎逻辑。不要这样:)去年我不得不深入研究这些东西,那时对我来说都是新的,并且有许多相同的问题。。你在评论中提到PM2。。这实际上是一个转折点,需要您使用socket.io-redis使集群模式正常工作,否则它会变得不可靠。非常感谢:)我很尴尬。我认为它比那复杂得多,因为我必须用PM2来运行它。同样的事情,只是不同的语言。合乎逻辑。不要这样:)去年我不得不深入研究这些东西,那时对我来说都是新的,并且有许多相同的问题。。你在评论中提到PM2。。这实际上是一个转折点,需要您使用socket.io-redis使集群模式正常工作,否则它会变得不可靠。非常感谢:)