当我运行我的Node.js脚本时,我只能使用localhost:8083访问它,而使用来自其他设备的机器的IP地址会导致"无法访问此站点&#34 ;。我使用以下Node.js 服务器脚本:
var app = require('express')(),
server = require('http').createServer(app),
io = require('socket.io').listen(server),
ent = require('ent'), // Blocks HTML characters (security equivalent to htmlentities in PHP)
fs = require('fs');
// Loading the page index.html
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});
io.sockets.on('connection', function (socket, username) {
// When the username is received it’s stored as a session variable and informs the other people
socket.on('new_client', function(username) {
username = ent.encode(username);
socket.username = username;
socket.broadcast.emit('new_client', username);(err) {});
});
// When a message is received, the client’s username is retrieved and sent to the other people
socket.on('message', function (message) {
message = ent.encode(message);
socket.broadcast.emit('message', {username: socket.username, message: message});
});
});
console.log('Chat Socket.io running on port 8083');
server.listen(8083);
以下是客户端脚本:
<script src = "http://code.jquery.com/jquery-1.10.1.min.js" > </script>
<script src="/socket.io / socket.io.js "></script>
<script>
// Connecting to socket.io
var socket = io.connect("10.254.17.115:8083");
// The username is requested, sent to the server and displayed in the title
var username = prompt('What\'s your username?');
socket.emit('new_client', username);
document.title = username + ' - ' + document.title;
// When a message is received it's inserted in the page
socket.on('message', function(data) {insertMessage(data.username, data.message)})
// When a new client connects, the information is displayed
socket.on('new_client', function(username) {
$('#chat_zone').prepend(
'<p><audio class="background" autoplay><source src="new-user.mp3" type="audio/wav"></audio><em>' + username + ' has joined the chat!</em></p>');
})
// When the form is sent, the message is sent and displayed on the page
$('#chat_form').submit(function() {
var message = $('#message').val();
socket.emit('message', message); // Sends the message to the others
insertMessage(username, message); // Also displays the message on our page
$('#message').val('').focus(); // Empties the chat form and puts the focus back on it
return false; // Blocks 'classic' sending of the form
});
// Adds a message to the page
function insertMessage(username, message) {
$('#chat_zone').prepend('<p><strong>' + username + '</strong> ' + message + '</p>');
}
</script>
编辑:修改了端口,但它们不是问题。当我将var socket = io.connect
更改为io()
时,它就有效了。
答案 0 :(得分:1)
这可能是您的服务器(和/或网络)防火墙的问题,而不是节点问题。每当您需要在服务器上使用新端口时,您都需要打开任何防火墙以允许流量到该端口。
一个好的起点是将端口扫描实用程序(例如nmap)下载到尝试连接的客户端。然后将该实用程序指向服务器,以查看打开的端口。
一旦您确认它是端口问题,请在机器的防火墙上打开该端口。之后,如果您仍无法联系本机,则网络防火墙可能会阻止流量到达服务器。
如果您仍然无法弄明白,那么您希望从网络专家(而非我的专业领域)获得一些建议,因此请考虑在Network Engineering下发布问题。另外,考虑在上面的代码中添加一些错误处理;如果不是防火墙问题,它可能会帮助您找出问题究竟是什么。
希望有所帮助, ~Nate
答案 1 :(得分:1)
您无需在客户端呼叫connect
,当客户端被提供socket.io.js
时,它将尝试自动连接到服务文件的服务器,并通过呼叫到io();
编辑:
var socket = io();
一旦客户端被提供了socket.io.js,这就是你需要调用的全部内容。在此示例中,socket
将是连接到服务器的套接字对象。
看看this简单示例。您可以看到,在客户端示例中,他们只会var socket = io();
连接回服务器。
答案 2 :(得分:1)
客户端和服务器端口应匹配(8081和8083不要):)