私はsocket.ioでNode.jsを試してみています
これが私のシナリオです。私はubuntu12.04ユーザーで、デスクトップにフォルダーppがあります。
その中に私はサーバーファイルを入れています、すなわちapp.js
これが内容です
var fs = require('fs')
, http = require('http')
, socketio = require('socket.io');
var server = http.createServer(function(req, res) {
res.writeHead(200, { 'Content-type': 'text/html'});
res.end(fs.readFileSync(__dirname + '/index.html'));
}).listen(8080, function() {
console.log('Listening at: http://localhost:8080');
});
socketio.listen(server).on('connection', function (socket) {
socket.on('message', function (msg) {
console.log('Message Received: ', msg);
socket.broadcast.emit('message', msg);
});
});
今、同じフォルダに私は次のような別のファイルindex.htmlを持っています
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
$(function(){
var iosocket = io.connect();
iosocket.on('connect', function () {
$('#incomingChatMessages').append($('<li>Connected</li>'));
iosocket.on('message', function(message) {
$('#incomingChatMessages').append($('<li></li>').text(message));
});
iosocket.on('disconnect', function() {
$('#incomingChatMessages').append('<li>Disconnected</li>');
});
});
$('#outgoingChatMessage').keypress(function(event) {
if(event.which == 13) {
event.preventDefault();
iosocket.send($('#outgoingChatMessage').val());
$('#incomingChatMessages').append($('<li></li>').text($('#outgoingChatMessage').val()));
$('#outgoingChatMessage').val('');
}
});
});
</script>
</head>
<body>
Incoming Chat: <ul id="incomingChatMessages"></ul>
<input type="text" id="outgoingChatMessage">
</body>
次のようなノードを使用してapp.jsを実行しようとしているとき
node app.js
エラーが発生します
warn - error raised: Error: listen EADDRINUSE
いくつかのドキュメントを調べたところ、ポートがビジーであることがわかったため、システムを再起動しましたが、それでも同じエラーが発生します。
何が間違っているのか教えてください。
別のポートを試してください。 8080は通常、Tomcatで使用されます。
使用する netstat -a -v
現在使用されているポートを確認します。
サーバーに接続していません。これは間違っています。
var iosocket = io.connect();
これは正しいです:
var iosocket = io.connect('http://localhost:8080');
また、ポート8080はサーバー上で「http-proxy」によって使用されています。他のポートを試してください。
非常に愚かな/単純な可能性は、複数のターミナルウィンドウが開いていないことを確認することです。このエラーが発生し、アプリを起動したときに2番目の既存の接続があることに気付きました。それを閉じてアプリを再起動すると、エラーはなくなりました。
クライアント側のホストに接続していないように見えます。
var iosocket = io.connect('http://localhost:8080');
これは、NodeJS + Express + SocketIOをセットアップして、アプリを2回目に起動したときにEADDRINUSEエラーが発生しないようにする方法の初心者向けの例です。
'use strict';
// Init
var http = require('http');
var express = require('express');
var socketIO = require('socket.io');
var cors = require('cors');
// Create Server app
var app = express();
var server = http.createServer(app);
var io = socketIO(server);
// Socket.io settings
io.set('browser client minification', true);
io.set('browser client etag', true);
io.set('browser client gzip', true);
io.set('browser client expires', true);
// Starting Express server
server.listen(serverPort, function() {
console.log(chalk.green('Server is running on localhost:' + serverPort + '...'));
});
// Middleware
app.use(cors());
// Routes
app.get('/', function(req, res) {
res.send("Hello world!");
console.log("Root visited!");
// Broadcast socketIO message inside Express
io.emit('new_message', "Hello world!");
});
// Socket.io
var connections = [];
var title = "Untitled";
io.sockets.on('connection', (socket) => {
socket.once('disconnect', () => {
connections.splice(connections.indexOf(socket), 1);
socket.disconnect();
console.log('Disconnected: %s. Remained: %s.', socket.id, connections.length)
});
// ...
connections.Push(socket);
console.log('Connected: %s. Total: %s', socket.id, connections.length);
});
これは便利な例だと思います。これをすべて設定する際に問題が発生した人に役立つことを願っています。