2016-05-23 203 views
12

我使用socket.io創建了我的第一個node.js應用程序。具體來說,我實現了由socket.io發佈的chat example。它在當地完美運作。然後我嘗試將它部署到Google App Engine(對代碼進行一些調整以使節點正常工作)。如何將socket.io部署到Google App Engine?

一切都顯示出來,表明節點部分工作正常。但聊天不起作用,表明socket.io部分不起作用。您可以看到已部署的應用程序(和頁面源)here

我需要額外做些什麼嗎? yaml或json文件中的東西?

YAML內容:

runtime: nodejs 
vm: true 

skip_files: 
    - ^(.*/)?.*/node_modules/.*$ 

JSON內容:

{ 
    "name": "Chaty", 
    "description": "chatrooms app", 
    "version": "0.0.1", 
    "private": true, 
    "license": "Apache Version 2.0", 
    "author": "McChatface", 
    "engines": { 
    "node": "~4.2" 
    }, 
    "scripts": { 
    "start": "node app.js", 
    "monitor": "nodemon app.js", 
    "deploy": "gcloud preview app deploy" 
    }, 
    "dependencies": { 
    "express": "^4.13.4", 
    "socket.io": "^1.4.6" 
    } 
} 

回答

4

谷歌已經使用的WebSockets here一個示例應用程序,你需要做下面的得到它正常工作:

  • 打開了防火牆端口的服務器,以便客戶端可以訪問您的服務器
  • 獲取谷歌應用程序引擎的內部IP,所以客戶知道什麼IP從您的服務器通過什麼連接到
  • 回聲出你的IP想休息API或HTML頁面

這應該是吧(不要拿我的話來說吧,這是我在對文檔進行一些研究之後能夠找到的),希望它有幫助!

正在獲取外部IP從谷歌應用程序引擎

var METADATA_NETWORK_INTERFACE_URL = 'http://metadata/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip'; 

function getExternalIp (cb) { 
    var options = { 
     url: METADATA_NETWORK_INTERFACE_URL, 
     headers: { 
      'Metadata-Flavor': 'Google' 
     } 
    }; 

    request(options, function (err, resp, body) { 
     if (err || resp.statusCode !== 200) { 
      console.log('Error while talking to metadata server, assuming localhost'); 
      return cb('localhost'); 
     } 

     return cb(body); 
    }); 
} 

內打開防火牆端口

gcloud compute firewall-rules create default-allow-websockets \ 
    --allow tcp:65080 \ 
    --target-tags websocket \ 
    --description "Allow websocket traffic on port 65080" 
+1

我覺得我很接近,但還沒有得到它的工作。我打開防火牆端口並部署了google websocket項目。這工作。但我還不知道如何使它與socket.io一起工作。因爲socket.io正在使用使用服務器在8080中偵聽並使用express。 //啓動服務器 var server = app.listen(process.env.PORT ||'8080','0.0.0.0',function(){ console.log('按Ctrl + C退出。' ); }); var io = require('socket.io')(server); –

+0

示例應用程序的鏈接已損壞;這似乎接近:https://github.com/GoogleCloudPlatform/appengine-websocketchat-java –

6

總之這不能在生產中完成,這似乎是work in process。正確的架構是在google計算引擎上有一個聊天服務器,詳見here

但作爲在谷歌應用引擎上使用socket.io的概念證明,與google appengine samples for websockets中顯示的非常相似。

在socket.io的情況下,請在服務器端執行以下步驟。下面的代碼片段。

  1. 創建第二個表達中間件和服務器。
  2. 在新服務器上附加/使用socket.io。
  3. 收聽端口(65080)。
  4. 在Google計算引擎上爲端口(65080)打開防火牆。
  5. 鏈接到working repository

插座。在服務器端IO變化

var app_chat = require('express')(); 
    var server1 = require('http').Server(app_chat); 
    var io = require('socket.io')(server1); 
    server1.listen(65080); 

    io.on('connection', function (socket) { 
     console.log('user connected'); 
     socket.on('chat_message', function (data) { 
     console.log('client sent:',data); 
     socket.emit('chat_message', 'Server is echoing your message: ' + data); 
     }); 
    }); 

打開防火牆的命令

gcloud compute firewall-rules create default-allow-websockets \ 
    --allow tcp:65080 \ 
    --target-tags websocket \ 
    --description "Allow websocket traffic on port 65080" 

我希望谷歌與生產就緒的解決方案很快就因爲這將成爲出現它是任何PaaS-arsenal中的關鍵裝甲。

+0

谷歌的示例應用程序的鏈接被打破;這個似乎接近:https://github.com/GoogleCloudPlatform/appengine-websocketchat-java –

相關問題