Клиент Socket.io не подключается к серверу

Я начал читать о node.js несколько недель назад и решил узнать о нем больше. Я установил node и socket.io, а также несколько других пакетов (экспресс и некоторые, которые я не помню) на свой Linux-сервер (Linux под ключ, в основном Ubuntu). Я нашел несколько руководств и просмотрел их, но не смог заставить ни одного из клиентов отправлять сообщения обратно на сервер. Вот некоторые из руководств, которые я прошел (у меня есть и другие, но сайт не позволяет размещать дополнительные ссылки):

Простой чат http://vivahate.com/2011/03/25/a-simple-chat-room-in-node-js/

Простой чат Socket.io в реальном времени http://webdevrefinery.com/forums/topic/7991-simple-socketio-real-time-chat/

Обратите внимание, что у webdevrefinery есть живая демонстрация в Интернете, которая работает в моем браузере с 2 разных компьютеров. Есть ссылка на код, который я скачал и запустил, и сервер работает нормально. Я перехожу по URL-адресу (192.168.0.30:3000 в моей локальной сети), и он показывает правильный HTML, а консоль выводит «debug - serve static /socket.io.js», как только я перехожу к URL-адресу. Когда я ввожу информацию и она "входит", ничего не происходит. Я поместил предупреждения в код, и, похоже, он не работает в строке «socket.send» в «sendMsg ()». Вот код, который я использую:

сервер.js:

    var http = require('http'),
    sys = require('sys'),
    fs = require('fs'),
    io = require('socket.io');

var server = http.createServer(function(req, res) {
    fs.readFile('chat.html', 'binary', function(err, data) {
        if( err ) {
            res.writeHead(500, {'Content-type': 'text/html'});
            res.write(data + "\n");
            res.end();
            return;
        }

        res.writeHead(200, {'Content-type': 'text/html'});
        res.write(data, 'binary');
        res.end();
    });
});
server.listen(3000);

var socket = io.listen(server);
socket.on('connection', function( client ) {
    client.on('message', function(data) {
        console.log("Message: " + JSON.stringify(data));
        socket.broadcast(data);
    });
    client.on('disconnect', function() {
    });
});

клиент.html

<html>
<head>
<style type="text/css">
#msgs {
    height: 50%;
    overflow-y: scroll;
}

div.odd {
    background-color: gray;
}
</style>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script type="text/javascript" src="http://192.168.0.30:3000/socket.io/socket.io.js"></script>
<title>Realtime Chat Test</title>
</head>
<body>
<div id="container">
<div id="msgs"></div>
<div id="form">
<form id="chat" action="javascript:sendMsg()">
Username:<input type="text" name="username" /><br />

Message:<input id="msg" type="text" name="message" /><br />
<input type="submit" />
</form>
</div>
</div>
</body>
<script type="text/javascript">
var socket = new io.Socket("192.168.0.30", {port:3000});
socket.connect();

var classes = new Array('even', 'odd');
var numMsgs = 0;

function reconnect() {
    if( socket.connecting ) {
        setTimeout('reconnect()',1000);
    }
    else if( !socket.connected ) {
        socket.connect();
        setTimeout('reconnect()',1000);
    }
}

socket.on('disconnect', function() {
    reconnect();
});

socket.on('message', function(data) {
    var ms = JSON.parse(data);
    if( ms.username !== undefined && ms.message !== undefined ) {
        numMsgs++;
        $('#msgs').append( function() {
            var d = $('<div class="'+classes[numMsgs%2]+'"/>');
            d.text(ms.username + ' says: ' + ms.message);
            return d;
        });
        var objDiv = document.getElementById('msgs');
        objDiv.scrollTop = objDiv.scrollHeight;
    }
}); 

function sendMsg() {
    var values = {};
    $.each($('#chat').serializeArray(), function(i,v) {
        values[v.name] = v.value;
    });
    document.getElementById("msg").value = "";
    socket.send(JSON.stringify(values));
}
</script>
</html>

В дистрибутиве Linux, который я использую, нет X или чего-то подобного, так как я просматриваю все страницы с компьютеров Windows, поэтому я не тестирую с локального хоста, хотя я предполагаю, что это должно работать с других хостов как подтверждается обслуживаемым HTML и выводом сообщения, когда я просматриваю страницу. Любые идеи о том, почему я никогда не получаю никаких сообщений от клиента на сервер? Я предполагаю, что совершаю одну и ту же ошибку с каждым уроком, так как я пробовал около 8 других, но у меня всегда одна и та же проблема. Спасибо.

Дэррил


person Darryl    schedule 03.08.2011    source источник


Ответы (2)


Это ответ на комментарии после ответа Альфреда. Я не мог понять, как поместить еще один комментарий в эту строку, поэтому я отправляю «ответ».

@Alfred - спасибо за пример, но, как сказал Даниэль, похоже, что мне еще многое предстоит сделать, учитывая, что я не получил простого сообщения, которое нужно было пройти. @Daniel - Что касается документации, я до сих пор не понимаю, как на самом деле использовать пример на домашней странице socket.io. Есть ссылка «Как использовать», которая ничего не делает, и ссылка на Wiki, которая ничего не объясняет в примерах. Я знаю, как запустить сервер, но до сих пор не знаю, как подключить клиент к серверу или даже как «запустить» клиент. В большинстве руководств есть какой-то «код ссылки», который указывает на клиентскую страницу с сервера, затем вы просто указываете в браузере «http://yoursiteaddress:port», и страница отображается. Код на домашней странице socket.io не имеет такой «связи» между кодом клиента и сервера. Вы должны перейти к «клиентскому» коду? Я попробовал это, и он обслуживает один и тот же код независимо от того, какой URL-адрес я перехожу, предполагая, что я иду по адресу «http://yoursiteaddress:port», что имеет смысл, но я не видел никакой документации, фактически объясняющей, как это использовать код. Поэтому я иду к учебникам, которые, по-видимому, все используют старый код. Есть ли какая-то документация, которую мне не хватает?

person Darryl    schedule 04.08.2011

Бьюсь об заклад, проблема заключается в ваших зависимостях. Давайте посмотрим на мои зависимости, например:

$ npm ls

├─┬ [email protected] 
│ ├─┬ [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ └── [email protected] 
├─┬ [email protected] 
│ ├── [email protected]  extraneous
│ ├── [email protected] 
│ ├── [email protected] 
│ └─┬ [email protected] 
│   └── [email protected]

От socket.io 0.6.x до 0.7.x API претерпел некоторые серьезные изменения. Похоже, вы читаете старые руководства по использованию socket.io 0.6.x и установили 0.7.x. Я советую вам прочитать инструкции по миграции.

Я хотел бы предоставить вам настоящую простую демонстрацию (использует экспресс, который вы установили), который, надеюсь, работает.

var app = require('express').createServer(),
    sio = require('socket.io');

app.get('/', function(req, res){
  res.send('<script src="/socket.io/socket.io.js"></script>\
<script>\
  var socket = io.connect("http://192.168.0.30");\
  socket.on("news", function (data) {\
    alert(data.hello);\
  });\
</script>');
});

app.listen(3000);

var io = sio.listen(app);

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

Должен предупреждать world при подключении к серверу socket.io.


Я также думаю, что с вашим примером будет работать установка socket.io 0.6.18, которая сейчас является последней версией 0.6.x, внутри вашего каталога внутри папки node_modules. Node.js будет включать этот модуль локально благодаря системе модулей node.js. Вы можете сделать это, создав этот каталог, если он еще не существует, выпустив mkdir -p node_modules. Затем установите socket.io, выдав npm install [email protected]. Тогда я думаю, вы сможете запустить эти старые примеры.

person Alfred    schedule 03.08.2011
comment
Спасибо за информацию! Кажется, что все уроки, которые я нашел, «старые», даже если они были сделаны в прошлом месяце. Знаете ли вы какие-либо учебные пособия, которые действительно работают в настоящее время? Я не слишком силен в том, чтобы вернуться и получить рабочий код для устаревшей кодовой базы. О, и фрагмент кода, который вы предоставили, сработал, хотя я не совсем понимаю, как он связан с наличием сервера и клиента, а не только с сервером. Эта страница socket.io с различиями между 0.6 и 0.7 помогла, но на ней все еще есть такие вещи, как ссылка на дополнительную информацию, которая просто ведет на домашнюю страницу, на которой нет инструкций. - person Darryl; 04.08.2011
comment
+1 за упоминание моего учебника;) @Darryl: вам действительно нужно просто использовать простой пример на socket.io и расти оттуда. Это надежный подход. Брать более сложные примеры и приводить их к вашим потребностям — чаще всего путь без успеха. - person Daniel Baulig; 04.08.2011