Cloudfoundry 上的非 http TCP 连接

2023-12-11

我是一名菜鸟移动开发人员,试图利用 cloudfoundry 的服务来运行我的服务器来处理一些聊天和角色移动。 我正在使用 Noobhub 来实现此目的(使用 Node.js 和 Corona SDK 的 TCP 连接 API 在服务器和客户端之间建立 TCP 连接)

所以基本上我正在尝试 Cloudfoundry(Node.js) 和我的机器(lua) 之间的非 http TCP 连接。

链接到 Noobhub(有一个带有服务器和客户端实现的 github 存储库。

我在做

Client

...
socket.connect("myappname.cloudfoundry.com", 45234)
...

(45234 来自服务器的 process.env.VCAP_APP_PORT 值,我从运行应用程序后通过“vmc logs myappname”获得的控制台输出检索到。)

Server

...
server.listen(process.env.VCAP_APP_PORT)

当我尝试连接时,它只是超时。

在我的本地机器上,做 客户

...
socket.connect("localhost",8989)

Server

...
server.listen(8989)

按预期工作。只是在cloudfoundry上不行。

我尝试了许多其他方法来执行此操作,例如将客户端的端口连接设置为 80 等。我看到了一些资源,但没有一个解决这个问题。 我通常不喜欢提问,所以如果您需要更多信息,请问我!

P.S.

在你带着愤怒的表情 D:

无法连接到 CloudFoundry 上的 TCP 服务器(localhost node.js 工作正常)

从这里,我可以看到这个人正在尝试做我正在做的类似事情。 所选答案是否意味着我必须使用主机标头(即使用 http 协议)进行连接?这是否也意味着 cloudfoundry 将不支持“TRUE”TCP 套接字,就像 heroku 或 app folg 一样?


实际上,process.env.VCAP_APP_PORT环境变量为您提供端口,Cloud Foundry L7 路由器 (nginx) 根据您的应用程序路由将您的 HTTP 流量重定向到该端口(例如,nodejsapp.vcap.me:80 被重定向到process.env.VCAP_APP_PORT虚拟机上的端口),所以你绝对不应该将它用于 TCP 连接。该端口应用于侦听 HTTP 流量。这就是为什么您的示例在本地工作而不在 Cloud Foundry 上工作。

对我有用的方法是使用 HTTP 服务器监听 CF 提供的端口,然后将 Websocket 服务器(在下面的示例中为 websocket.io)附加到它。我创建了可以在本地和 CF 中运行的示例回显服务器。我的 Node.js 文件的内容名为example.js is

var host = process.env.VCAP_APP_HOST || "localhost";
var port = process.env.VCAP_APP_PORT || 1245;

var webServerApp = require("http").createServer(webServerHandler);  
var websocket = require("websocket.io");
var http = webServerApp.listen(port, host);
var webSocketServer = websocket.attach(http);

function webServerHandler (req, res) {
    res.writeHead(200);
    res.end("Node.js websockets.");
}
console.log("Web server running at " + host + ":" + port);

//Web Socket part
webSocketServer.on("connection", function (socket) {
    console.log("Connection established."); 

    socket.send("Hi from webSocketServer on connect");

    socket.on("message", function (message) { 
        console.log("Message to echo: " + message);
        //Echo back
        socket.send(message);
    });

    socket.on("error", function(error){
        console.log("Error: " + error);
    });

    socket.on("close", function () { console.log("Connection closed."); });
});

依赖库websocket.io可以安装运行npm install websocket.io命令在同一目录中。还有一个manifest.yml描述 CF 部署参数的文件:

---
applications:
- name: websocket
  command: node example.js
  memory: 128M
  instances: 1
  host: websocket
  domain: vcap.me
  path: .

所以,跑步cf push从此目录将应用程序部署到我的本地 CFv2 实例(在cf_nise_安装程序) 为了测试这个 echo websocket 服务器,我使用了简单的index.html文件,它连接到服务器并发送消息(所有内容都记录到控制台中):

<!DOCTYPE html>
    <head>
        <script>        
        var socket = null;
        var pingData = 1;
        var prefix = "ws://";

        function connect(){
            socket = new WebSocket(prefix + document.getElementById("websocket_url").value);
            socket.onopen = function() { 
                console.log("Connection established"); 
            };
            socket.onclose = function(event) { 
                if (event.wasClean) {
                    console.log("Connection closed clean");
                } else {
                    console.log("Connection aborted (e.g. server process killed)");
                }
                    console.log("Code: " + event.code + " reason: " + event.reason);
                };             
            socket.onmessage = function(event) { 
                console.log("Data received:  " + event.data);
            };
            socket.onerror = function(error) { 
                console.log("Error: " + error.message);               
            };
        }        
        function ping(){
            if( !socket || (socket.readyState != WebSocket.OPEN)){
                console.log("Websocket connection not establihed");
                return;
            }            
            socket.send(pingData++);
        }        
        </script>
    </head>
    <body>
        ws://<input id="websocket_url">
        <button onclick="connect()">connect</button>
        <button onclick="ping()">ping</button>
    </body>
</html>

剩下要做的就是在文本框中输入服务器地址Index页面(在我的例子中是 websocket.vcap.me),按“连接”按钮,我们就可以通过 TCP 建立有效的 Websocket 连接,可以通过发送 Ping 和接收 echo 来测试该连接。这在 Chrome 中运行良好,但在 IE 10 和 Firefox 中存在一些问题。

关于“TRUE”TCP套接字,没有确切的信息:根据最后一段here您不能使用除 80 和 443(HTTP 和 HTTPS)之外的任何端口从 Cloud Foundry 外部与您的应用程序进行通信,这让我认为 TCP 套接字无法实现。然而,根据this答案,你实际上可以使用任何其他端口...似乎需要对这个问题进行一些深入的调查...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cloudfoundry 上的非 http TCP 连接 的相关文章

随机推荐

  • 如何在 Firestore (SWIFT) 中使用 FieldValue 减少值?

    阅读博客post和文档 我发现我们可以使用增加一个值FieldValue但我找不到减量函数 document fitness teams Team 1 updateData step counter FieldValue decrement
  • 查找当前流是否包含 ClearCase 中的基线

    假设我有一个名为 A1 的基线 然后我想看看是否有任何方法可以让我在同一个项目的任何地方进入另一个流 看看我的流中是否有 A1 IE 我的流中是否有 A1 中所做的代码更改 有什么快速的方法可以做到这一点吗 先感谢您 ClearCase 基
  • VBScript循环遍历文件夹中的所有文件

    我有在单个文件上执行该过程的代码 任何人都可以更改此脚本 以便它循环遍历目录 H Letter Display Letters 中文件类型为 的所有文件 LTR 并保存它们全部 Const ForReading 1 Const ForWri
  • $_GET 变量的编码混乱

    我在网站编码方面遇到了很多麻烦 这是我现在的问题 如果我去analize php dialog rbol哪个代码是
  • 使用 for 循环删除列表中的项目

    我有一个包含主题的数组 每个主题都有相关的时间 我想比较列表中的每个主题 如果有两个相同的科目 我想添加两个科目的时间 并且还想删除第二个科目信息 科目名称和时间 但是如果我删除该项目 列表就会变短 并且会出现超出范围的错误 我尝试使用 s
  • 使用 GhostScript 将 PDF 转换为服务器上的图像集合

    这些是我试图实现的步骤 在服务器上上传 PDF 文档 使用 GhostScript 将 PDF 文档转换为一组图像 每个页面都转换为图像 将图像集合发送回客户端 到目前为止 我感兴趣的是 2 首先 我下载了两个gswin32c exe an
  • Mahout row相似度

    我正在尝试计算维基百科文档之间的行相似度 我有 tf idf 向量的格式Key class class org apache hadoop io Text Value Class class org apache mahout math V
  • 如何读取Oracle集合类型的元素类型?

    我将 Oracle 集合类型定义为 type tab foo as table of obj foo Where obj foo定义为 type obj foo as object 通过致电 select from sys all type
  • ModuleNotFoundError:没有名为“pandas._libs.tslibs.timedeltas”的模块

    我是Python的学习者 执行我的脚本时出现问题 表明failed to execute script在通过 Pyinstaller 打包时 由于 ModuleNotFoundError 没有名为 pandas libs tslibs ti
  • 如何中止映射器(或减速器)内的 MR 作业

    我尝试在map方法中抛出IOExceptions 但MR作业没有停止 抛出大量 IOException 后作业将停止 有没有什么方法可以通过抛出异常或一些简单的调用来停止整个工作 谢谢 这不是 Hadoop 的理想用例 也不是一个好的实践
  • libusb-win32:自动安装驱动程序过滤器

    我在使用基于 libusb w32 的程序来检测设备时遇到了问题 该程序必须检测数码相机 我需要自动安装驱动程序过滤器 以便检测到任何新相机 而无需任何手动操作 我使用过 install filter i class 6BDD1FC6 81
  • 使用十进制数字生成可变颜色

    我创建了一个文件 其中第一列是十进制颜色线 第二列是 y 轴 x 轴是行号 0 0 1 1 2 2 然后我运行这个命令 plot test dat u 0 2 1 pt 7 ps 1 lc rgb variable 正如您在图片中看到的 输
  • 一个java文件如何调用另一个java文件的方法? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 如何在java中调用不同类 文件 的方法 是否需要对象 或者有第三种方法来合并java文档吗 我们可以使用简单的方法调用吗 有没有正确的方法来调用新方法 我不清楚你的问题 据我了解你想
  • 将 Vue 3 组件渲染为 HTML 字符串

    我正在开发一个 vue js 项目 版本 3 我遇到了一种情况 我想将组件的渲染 HTML 视图用于当前组件的方法 我在 Vue 项目中创建了以下 SVG 组件 CircleWithTextSvg vue
  • 在 Haskell 中使用“foldr”实现“member”函数

    我这样尝试过 member e False member e xs foldr e xs 进而 member 3 1 2 3 4 5 我收到此错误消息 No instance for Num Bool arising from the li
  • 在 Windows 窗体应用程序中永远循环

    我正在使用 Visual C 并且我正在使用 Windows 窗体而不是控制台应用程序 因此我不是在 Main 中工作 而是在表单文件中工作 我对 C 也很陌生 如果我的一些问题很愚蠢 我很抱歉 我基本上需要做的是 当我的程序启动时 我需要
  • 当使用子目录为每个目标构建依赖项时,CMake 无法找到外部库

    我有一组库及其各自的测试 它们按以下方式组织 Lib1 Lib1 Test Lib2 Lib2 Test Lib3 Lib3 Test 等等 其中一些库依赖于其他库 例如Lib1依赖于取决于Lib2 而 Lib3 依赖于 Lib1 我可以轻
  • SQLite3 查询 ORDER BY 参数带有 ?符号

    我正在尝试在 python 中使用 sqlite3 进行查询 通过参数列 overall risk 或 latest risk 这是双数 进行排序 param overall risk cur db execute SELECT FROM
  • 在 Python Tkinter 中绑定 Ctrl (-)

    我有一个带有文本小部件的应用程序 我希望当用户按下 Control 键和减号键 时我的字体变小 the code self bind all
  • Cloudfoundry 上的非 http TCP 连接

    我是一名菜鸟移动开发人员 试图利用 cloudfoundry 的服务来运行我的服务器来处理一些聊天和角色移动 我正在使用 Noobhub 来实现此目的 使用 Node js 和 Corona SDK 的 TCP 连接 API 在服务器和客户