我正在使用socket.io
学习 nodejs 事件驱动编程,以便我可以构建一个聊天应用。
所以,我现在在Server
创建了一个Client
和localhost
在不同的端口运行。
var express = require('express');
var app = express();
var http = require('http').createServer(app);
var io = require('socket.io')(http, {origins: '*.*', transports: ['websocket', 'xhr-polling']});
var port = process.env.PORT || 8080;
http.listen(port, function () {
console.log('Cat Server listening at http://127.0.0.1:%d', port);
});
app.use(express.static(__dirname + '/public'));
io.on('connection', function (socket) {
console.log('Connection to client established ', socket);
var addedUser = false;
// when the client emits 'love event', this listens and executes
socket.on('LoveEvent', function (data) {
console.log("we tell the client to execute 'logevent'")
socket.broadcast.emit('LoveEvent', {
username: socket.username,
message: data
});
});
);
客户端通过socket.io
连接到服务器8080我在public/chat.js
public/index.html
中的以下代码
var socket = io();
socket.connect('http://localhost:8080', {transports: ['websocket', 'xhr-polling']})
console.log("Connection to Cat socket server, ", socket)
而且,public/index.html
是
<script src="http://localhost:8080/socket.io/socket.io.js"></script>
<script src="/chat.js"></script>
客户端结构
$ ll
total 24
-rw-r--r-- 1 prayagupd staff 30 Nov 1 20:18 README.md
-rw-r--r-- 1 prayagupd staff 325 Nov 1 20:18 Server.js
drwxr-xr-x 91 prayagupd staff 3094 Oct 26 18:11 node_modules
-rw-r--r-- 1 prayagupd staff 249 Nov 1 20:18 package.json
drwxr-xr-x 8 prayagupd staff 272 Nov 1 20:22 public
node_modules
socket.js
$ ll node_modules/socket.io/lib/
total 80
-rw-r--r-- 1 prayagupd staff 5411 Oct 26 15:59 client.js
-rw-r--r-- 1 prayagupd staff 8933 Oct 26 15:59 index.js
-rw-r--r-- 1 prayagupd staff 5366 Oct 26 15:59 namespace.js
-rw-r--r-- 1 prayagupd staff 9493 Oct 26 15:59 socket.js
当我启动服务器时
$ node Server.js
Cat Server listening at http://127.0.0.1:8080
和客户,
$ node Client.js
Cat client running at localhost:3000
我希望在服务器端发送连接消息,因为我正在使用Server.js
中的消息进行调试console.log('Connection to client established ', socket);
我手动尝试从chorme控制台创建socket
并发送了一个事件,服务器似乎没有订阅它。
s.connect("http://localhost:8080", {autoConnect : true})
Socket {io: Manager, nsp: "/", json: Socket, ids: 0, acks: Object…}
s.emit("LoveEvent", "Love")
Socket {io: Manager, nsp: "/", json: Socket, ids: 0, acks: Object…}
此外,当浏览器中的客户端在浏览器控制台中的404 error
上跟随transport=polling
时,
我不知道为什么在端口3000上进行轮询,这本身就是这样。
当一切都在同一台服务器上时,它运行良好。我现在重构了它:(
我这里有后端和前端代码=&gt; prayagupd/lovejs
答案 0 :(得分:0)
当客户端和socket.io服务器是分开的时,您应该在客户端的“socket.io”子文件夹中下载并复制socket.io客户端库(https://github.com/socketio/socket.io-client处的socket.io.js
) app(例如)然后像这样导入它:
<script src="/socket.io/socket.io.js"></script>
或者不复制它,您只需从CDN导入它:
<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
(没有互联网连接就行不通。)
你可以从服务器上删除socket.io路由,在这种情况下没用:
io = require('socket.io')({ serveClient: false, ...});
答案 1 :(得分:0)
可能是您的来源*.*
,*:*
how to set origins的格式,但socket.io应该可以在不同的端口上运行。
答案 2 :(得分:0)
这也发生在我身上, 但我从 socket.io 版本 3 更改为 2 => "socket.io": "^2.3.0" 并解决了问题。