2015-01-20 10 views
2

У меня есть приложение, которое вызывает сервер socket.io, размещенный на геройку. Когда я запустить мое приложение на моем мобильном телефоне (Android) с командой "PhoneGap служить" У меня есть эта ошибка:Телефон зазор + socket.io + heroku

[PhoneGap] прокси ошибка для URL: myserverheroku: 3000/розетка .io/EIO = 3 & транспорт = опрос & т = 1421696372422-2 неопределенными [PhoneGap] ECONNREFUSED myserverheroku: 3000/socket.io/EIO = 3 & транспорт = опрос & т = 1421696372422-2

Можете ли вы дать пожалуйста, помогите?

(Извините за мой английский, я французский)

server.js файл:

var express = require('express'); 
var app = express(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 

app.get('/', function(req, res){ 
    res.sendfile('index.html'); 
}); 

http.listen(process.env.PORT || 3000); 

io.on('connection', function (socket) { 
    socket.emit('news', { message: 'Hello world' }); 
}); 

app.js файл:

var socket = io.connect('http://star-wars-bluff.herokuapp.com'); 
socket.on('news', function (data) { 
    document.getElementById('welcomeMsg').innerHTML = data.message; 
}); 

index.html файл:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8" /> 
     <meta name="format-detection" content="telephone=no" /> 
     <meta name="msapplication-tap-highlight" content="no" /> 
     <!-- WARNING: for iOS 7, remove the width=device-width and height=device-height attributes. See https://issues.apache.org/jira/browse/CB-4323 --> 
     <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" /> 
     <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css"> 
     <link rel="stylesheet" type="text/css" href="css/main.css" /> 
     <title>Star Wars Bluff</title> 
    </head> 
    <body> 
     <div class="jumbotron text-center"> 
      <h1>Star Wars Bluff</h1> 
     </div> 
     <div class="container"> 
      <div id="welcomeMsg"></div> 
     </div> 
     <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js"></script><!-- load angular --> 
     <script type="text/javascript" src="cordova.js"></script> 
     <script src="http://star-wars-bluff.herokuapp.com/socket.io/socket.io.js"></script> 
     <script type="text/javascript" src="js/app.js"></script> 
    </body> 
</html> 

файл config.xml:

<?xml version='1.0' encoding='utf-8'?> 
<widget id="com.heroku.star-wars-bluff" version="1.0.0" versionCode = "10" xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0"> 
    <name>Star Wars Bluff</name> 
    <description> 
     Le poker des cafards version Star Wars 
    </description> 
    <author email="[email protected]" href="http://labo-web.fr"> 
     Labo web 
    </author> 
    <content src="index.html" /> 
    <preference name="permissions" value="none" /> 
    <preference name="phonegap-version" value="3.5.0" /> 
    <preference name="orientation" value="default" /> 
    <preference name="target-device" value="universal" /> 
    <preference name="fullscreen" value="true" /> 
    <preference name="webviewbounce" value="true" /> 
    <preference name="prerendered-icon" value="true" /> 
    <preference name="stay-in-webview" value="false" /> 
    <preference name="ios-statusbarstyle" value="black-opaque" /> 
    <preference name="detect-data-types" value="true" /> 
    <preference name="exit-on-suspend" value="false" /> 
    <preference name="show-splash-screen-spinner" value="true" /> 
    <preference name="auto-hide-splash-screen" value="true" /> 
    <preference name="disable-cursor" value="false" /> 
    <preference name="android-minSdkVersion" value="7" /> 
    <preference name="android-installLocation" value="auto" /> 
    <!-- <gap:plugin name="org.apache.cordova.battery-status" /> 
    <gap:plugin name="org.apache.cordova.camera" /> 
    <gap:plugin name="org.apache.cordova.media-capture" /> 
    <gap:plugin name="org.apache.cordova.console" /> 
    <gap:plugin name="org.apache.cordova.contacts" /> 
    <gap:plugin name="org.apache.cordova.device" /> 
    <gap:plugin name="org.apache.cordova.device-motion" /> 
    <gap:plugin name="org.apache.cordova.device-orientation" /> 
    <gap:plugin name="org.apache.cordova.dialogs" /> 
    <gap:plugin name="org.apache.cordova.file" /> 
    <gap:plugin name="org.apache.cordova.file-transfer" /> 
    <gap:plugin name="org.apache.cordova.geolocation" /> 
    <gap:plugin name="org.apache.cordova.globalization" /> 
    <gap:plugin name="org.apache.cordova.inappbrowser" /> 
    <gap:plugin name="org.apache.cordova.media" /> 
    <gap:plugin name="org.apache.cordova.network-information" /> 
    <gap:plugin name="org.apache.cordova.splashscreen" /> 
    <gap:plugin name="org.apache.cordova.vibration" /> --> 
    <icon src="icon.png" /> 
    <icon gap:platform="android" gap:qualifier="ldpi" src="www/res/icon/android/icon-36-ldpi.png" /> 
    <icon gap:platform="android" gap:qualifier="mdpi" src="www/res/icon/android/icon-48-mdpi.png" /> 
    <icon gap:platform="android" gap:qualifier="hdpi" src="www/res/icon/android/icon-72-hdpi.png" /> 
    <icon gap:platform="android" gap:qualifier="xhdpi" src="www/res/icon/android/icon-96-xhdpi.png" /> 
    <icon gap:platform="blackberry" src="www/res/icon/blackberry/icon-80.png" /> 
    <icon gap:platform="blackberry" gap:state="hover" src="www/res/icon/blackberry/icon-80.png" /> 
    <icon gap:platform="ios" height="57" src="www/res/icon/ios/icon-57.png" width="57" /> 
    <icon gap:platform="ios" height="72" src="www/res/icon/ios/icon-72.png" width="72" /> 
    <icon gap:platform="ios" height="114" src="www/res/icon/ios/icon-57-2x.png" width="114" /> 
    <icon gap:platform="ios" height="144" src="www/res/icon/ios/icon-72-2x.png" width="144" /> 
    <icon gap:platform="webos" src="www/res/icon/webos/icon-64.png" /> 
    <icon gap:platform="winphone" src="www/res/icon/windows-phone/icon-48.png" /> 
    <icon gap:platform="winphone" gap:role="background" src="www/res/icon/windows-phone/icon-173-tile.png" /> 
    <gap:splash gap:platform="android" gap:qualifier="port-ldpi" src="www/res/screen/android/screen-ldpi-portrait.png" /> 
    <gap:splash gap:platform="android" gap:qualifier="port-mdpi" src="www/res/screen/android/screen-mdpi-portrait.png" /> 
    <gap:splash gap:platform="android" gap:qualifier="port-hdpi" src="www/res/screen/android/screen-hdpi-portrait.png" /> 
    <gap:splash gap:platform="android" gap:qualifier="port-xhdpi" src="www/res/screen/android/screen-xhdpi-portrait.png" /> 
    <gap:splash gap:platform="blackberry" src="www/res/screen/blackberry/screen-225.png" /> 
    <gap:splash gap:platform="ios" height="480" src="www/res/screen/ios/screen-iphone-portrait.png" width="320" /> 
    <gap:splash gap:platform="ios" height="960" src="www/res/screen/ios/screen-iphone-portrait-2x.png" width="640" /> 
    <gap:splash gap:platform="ios" height="1136" src="www/res/screen/ios/screen-iphone-portrait-568h-2x.png" width="640" /> 
    <gap:splash gap:platform="ios" height="1024" src="www/res/screen/ios/screen-ipad-portrait.png" width="768" /> 
    <gap:splash gap:platform="ios" height="768" src="www/res/screen/ios/screen-ipad-landscape.png" width="1024" /> 
    <gap:splash gap:platform="winphone" src="www/res/screen/windows-phone/screen-portrait.jpg" /> 
    <access origin="http://star-wars-bluff.herokuapp.com" /> 
</widget> 

ответ

0

Я решил свою проблему. Когда я пытался открыть URL-адрес myserverheroku: 3000 у меня было 404. Я подключаю свой мобильный телефон с телефонной связью на ip, например, 1.1.1.1:3000, поэтому, когда я пытался подключиться к серверу сокетов, телефонная задержка добавит порт 3000.

Мое решение заменить:

var socket = io.connect('http://star-wars-bluff.herokuapp.com'); 

по

var socket = io.connect('http://star-wars-bluff.herokuapp.com:80'); 

Но теперь, socket.io не работает очень хорошо, может быть, из-за angularjs. В destop все работает нормально, но не на мобильном телефоне.

app.js

var swb = angular.module('swb', ['ngRoute', 'swb.controllers']); 

swb.config(['$routeProvider', function ($routeProvider) { 
    $routeProvider.when('/init', {templateUrl: 'partials/init.html', controller: 'InitCtrl'}); 
    $routeProvider.when('/welcome', {templateUrl: 'partials/welcome.html', controller: 'WelcomeCtrl'}); 
    $routeProvider.otherwise({redirectTo: '/init'}); 
}]); 

controllers.js

angular.module('swb.controllers', ['btford.socket-io']). 
factory('socket', function (socketFactory) { 
    return socketFactory({ 
    ioSocket: io.connect('http://star-wars-bluff.herokuapp.com:80') 
    }); 
}) 
.controller('MainCtrl', ['$scope', '$rootScope', '$window', '$location', 'socket', function ($scope, $rootScope, $window, $location, socket) { 
    $rootScope.chat = []; 
    $rootScope.players = []; 
    $rootScope.player = {}; 
    $rootScope.slide = ''; 

    $rootScope.back = function() { 
     $rootScope.slide = 'slide-right'; 
     $window.history.back(); 
    } 

    $rootScope.go = function(path){ 
     $rootScope.slide = 'slide-left'; 
     $location.url(path); 
    } 

    socket.on('connected', function (data) { 
     $rootScope.players = data.players; 
     if(data.player) 
      $rootScope.player = angular.copy(data.player); 
     $rootScope.chat.push(data.message); 
    }); 
    socket.on('disconnected', function (data) { 
     $rootScope.players = data.players; 
     $rootScope.chat.push(data.message); 
    }); 
}]) 
.controller('InitCtrl', ['$scope', '$rootScope', 'socket', function ($scope, $rootScope, socket) { 
    $scope.createPlayer = function(){ 
     socket.emit('adduser', $rootScope.player); 
     $rootScope.go('/welcome'); 
    }; 
}]) 
.controller('WelcomeCtrl', ['$scope', '$rootScope', 'socket', function ($scope, $rootScope, socket) { 

}]); 

index.html:

<!DOCTYPE html> 
<html ng-app="swb"> 
    <head> 
     <meta charset="utf-8" /> 
     <meta name="format-detection" content="telephone=no" /> 
     <meta name="msapplication-tap-highlight" content="no" /> 
     <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" /> 
     <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css"> 
     <link rel="stylesheet" type="text/css" href="css/main.css" /> 
     <title>Star Wars Bluff</title> 
    </head> 
    <body ng-controller="MainCtrl"> 
     <div class="jumbotron text-center"> 
      <h1>Star Wars Bluff</h1> 
     </div> 
     <div ng-view ng-class="slide"></div> 
     <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js"></script> 
     <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular-route.js"></script> 
     <script src="http://star-wars-bluff.herokuapp.com/socket.io/socket.io.js"></script> 
     <script type="text/javascript" src="js/cordova.js"></script> 
     <script type="text/javascript" src="js/app.js"></script> 
     <script type="text/javascript" src="js/controllers.js"></script> 
     <script type="text/javascript" src="js/socket.js"></script> 
    </body> 
</html> 

init.html

<h2>Bienvenue sur Star Wars Bluff</h2> 
<form name="addPlayer" ng-submit="addPlayer.$valid && createPlayer()" novalidate> 
    <input placeholder="Votre nom" type="text" ng-model="player.name" required> 
    <button type="submit">Jouer</button> 
</form> 

добро пожаловать.JS

<h2>Liste des joueurs</h2> 
<ul> 
    <li ng-repeat="connectedPlayer in players"><span ng-class="{you: player.id==connectedPlayer.id}">{{player.id}} {{connectedPlayer.id}} {{ connectedPlayer.name }}</span></li> 
</ul> 
<h2>Infos</h2> 
<ul> 
    <li ng-repeat="info in chat | limitTo: -5">{{ info }}</li> 
</ul> 

server.js

// init server 
var express = require('express'); 
var app = express(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 

app.get('/', function(req, res){ 
    res.sendfile('index.html'); 
}); 

http.listen(process.env.PORT || 3000); 

// usefull functions 
var removeByAttr = function(arr, attr, value){ 
    var i = arr.length; 
    while(i--){ 
     if(arr[i] 
      && arr[i].hasOwnProperty(attr) 
      && (arguments.length > 2 && arr[i][attr] === value)){ 

      arr.splice(i,1); 

     } 
    } 
    return arr; 
} 

// games data & functions 
var types = [...]; 

var cards = [...]; 

var playersPerRoom = 6, 
    players = [], 
    rooms = []; 

var gameReady = false; 

var currentPlayer, 
    currentCard, 
    currentOpponent, 
    currentType; 

io.sockets.on('connection', function (socket) { 
    socket.on('adduser', function(data){ 
     socket.player = data; 
     if(rooms.length < 1){ 
      socket.room = 'room1'; 
      rooms.push(socket.room); 
     }else{ 
      var roomNumber = Math.ceil((players.length + 1)/playersPerRoom); 
      socket.room = 'room' + roomNumber; 
      if(rooms.indexOf(socket.room) == -1) 
       rooms.push(socket.room); 
     } 
     socket.player.room = socket.room; 
     if(players.length < 1) 
      socket.player.id = 1; 
     else 
      socket.player.id = players[players.length - 1].id + 1; 
     players.push(socket.player); 
     socket.join(socket.room); 
     socket.emit('connected', {message: 'Bienvenue sur le serveur ' + socket.room, players: players, player: socket.player}); 
     socket.broadcast.to(socket.room).emit('connected', {message: socket.player.name + ' est désormais connecté au serveur ' + socket.room, players: players}); 
    }); 
    socket.on('disconnect', function(){ 
     if(socket.player){ 
      removeByAttr(players, 'id', socket.player.id); 
      socket.broadcast.emit('disconnected', {message: socket.player.name + ' a quitté le serveur ' + socket.room, players: players}); 
      socket.leave(socket.room); 
     } 
    }); 
}); 

Когда я подключить телефон в настольном приложении, список пользователей и чат обновляются, но на другой телефон, они не обновляются сами.

У вас есть идеи решить мою проблему?

0

У меня были те же проблемы при обновлении до phonegap ~ 4.2 ... переход на более раннюю версию решил проблему. Кажется, это ошибка в телефонной трубке.

Попробуйте понизиться до e. г. [email protected]

npm install -g [email protected] 
0

После многих исследований я обнаружил эту ошибку:

Invalid продолжение байт

Кажется, подходит к функции "readContinuationByte" из Socket.io.

У вас есть идеи решить мою проблему?

0

Наконец, я использую модуль utf8 для узла, чтобы закодировать строку, которая переименована в socket.io, и она отлично работает!