Я начал читать о 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 других, но у меня всегда одна и та же проблема. Спасибо.
Дэррил