2015-02-03 3 views
0

Я хочу подключиться к unix-сокету с помощью socket.io-client, Отсутствие успеха (в основном время ожидания, последний образец - ошибка разрешения DNS).socket.io connect to unix socket

var clientio = require('socket.io-client'); 
// i tried all variants here 
//client=clientio.connect('port.io/',{'force new connection': true}); 
//client=clientio.connect('unix://port.io/',{'force new connection': true}); 
//client=clientio.connect('http//unix:port.io/',{'force new connection': true}); 

client.on('connect',connect); 

Можно ли подключить разъем socket.io к разъему unix?

Я проверил серверную розетку с помощью nc -U port.io, он отлично работает.

ответ

1

socket.io запускает определенный протокол поверх протокола webSocket, который затем запускается на обычном сокете TCP. Если вы пытаетесь подключиться к обычным сокетам Unix, вы не можете использовать socket.io.

Вы можете использовать net.Socket, описанный здесь: http://nodejs.org/api/net.html, который согласно этому документу является «абстракцией сокета TCP или UNIX».

Сокет socket.io имеет очень специфический протокол запуска, который он использует, и очень конкретный формат данных проводов, а также очень специфическую последовательность сообщений и стратегию сохранения тепла. Оба конца должны поддерживать все, что для подключения socket.io к работе.

Простой сокет - это корневой транспорт на самом низком уровне, но все эти другие вещи должны существовать поверх этого простого гнезда, чтобы обе стороны могли разговаривать друг с другом с помощью socket.io. См. this article, если вы хотите получить краткий обзор того, что связано с написанием сервера webSocket. Socket.io - это еще один протокол поверх транспорта webSocket.


Все еще очень смущает здесь. Я понятия не имею, почему вы упомянули стандартный сокет Unix.

Если вы пытаетесь подключиться с одного сервера nodejs к другому серверу nodejs, используя socket.io, и на одном из серверов работает сервер socket.io по умолчанию, который вы указали в своих комментариях, тогда вы сможете это сделать это от другой, чтобы подключиться к серверу Socket.io:

var socket = require('socket.io-client')('http://port.io'); 
socket.on('connect', function(){}); 
socket.on('event', function(data){}); 
socket.on('disconnect', function(){}); 

Это предполагает, что port.io является областью вашего Socket.io сервера (то, что может быть решено с DNS, чтобы указать на действительный сервер). Важно, чтобы вы использовали фактический URL-адрес HTTP, потому что все соединения webSocket и socket.io инициируются с HTTP-запросом на фактический URL-адрес HTTP.

Я не понимаю, что вы пытаетесь сделать с помощью схем URL Unix.

+0

Почему сокет. io заботится о прототипе самого низкого уровня l? –

+0

Я понимаю, что я могу подключиться с помощью net.Socket, но почему, если мне нужна модель событий socket.io? –

+0

@eicto - У вас должно быть что-то, что говорит socket.io на BOTH, чтобы связь работала правильно. Простой Unix-сокет сам по себе не знает, как инициировать соединение socket.io (которое начинается как HTTP-запрос, а затем обновляется до webSocket) или умеет говорить о событиях socket.io. Вы можете получить код, чтобы перейти на сервер Unix, который будет говорить на socket.io, и слушал порт, который вы собираетесь подключить, а затем вы можете его использовать. – jfriend00

0

Ваш вопрос неясен, но так как я пришел сюда в поисках аналогичного ответа, вот код, который я придумал.

Этот код открывает сокет UNIX, и вещает все, что он принимает к любому подключенному socket.io клиентов (через WebSockets)

// Generated by CoffeeScript 1.9.2 
var app, domain_server, fs, io, net, server; 
fs = require('fs'); 
net = require('net'); 
app = require('express')(); 
server = require('http').Server(app); 
io = require('socket.io')(server); 

/* Handle Unix Domain Socket 
* * Delete file if it already exists, 
* avoiding EADDRINUSE */ 

if (fs.existsSync('/tmp/domain_socket')) { 
    fs.unlinkSync('/tmp/domain_socket'); 
} 

domain_server = net.createServer(function(socket) { 
    socket.on('data', function(data) { 
    /* broadcast messages from unix socket to websockets */ 
    io.sockets.emit('domain-message', data.toString()); 
    }); 
}); 

domain_server.listen('/tmp/domain_socket', function() { 
    console.log('domain_server bound'); 
}); 


/* 
* Handle Web Serving/WebSockets 
*/ 

server.listen(8080); 

app.get('/', function(req, res) { 
    res.sendFile(__dirname + '/index.html'); 
}); 

io.on('connection', function(socket) { 
    socket.emit('message', { 
    hello: 'connected' 
    }); 
}); 
+0

Что плохого в моем вопросе? Это не то, что я хотел, однако, вопрос заключается в том, чтобы избежать tcp-стека и использовать socket.io, o'c. Не проблема отправлять данные, полученные из сокета unix или из файла или что-то другое через socket.io, установленный с помощью tcp , o'c нет проблем для имитации решения, но для меня кажется действительно странным, что реализация протокола высокого уровня заботится об этом транспорте. –

+0

mimic solution не касается вашего ответа, это примерно как «make localhost proxy» –

2

Просто нашел это время в поисках ответов на аналогичный вопрос.

socket.io-client AFAIK зависит от engne.io-client, которая зависит от ws, который содержит следующее:

var isUnixSocket = serverUrl.protocol === 'ws+unix:';

Смотрите здесь: https://github.com/websockets/ws/blob/4f99812b1095979afaad58865846b160334f3415/lib/WebSocket.js#L598.

Таким образом, похоже, что возможно подключение клиента через сокет UNIX, если это делается в node.js (или что-то подобное) - я не думаю, что это можно сделать в веб-браузере.

Я не пробовал, но, возможно, что-то, как это будет работать:

var client=clientio.connect('ws+unix:/port.io',{'force new connection': true});

Update: это выглядит как Socket.io и engine.io действительно не нравится сокеты UNIX :(Чтобы подключиться через UDS, прямое использование модуля ws кажется единственным способом, но тогда он не будет знать все дополнительные материалы, которые socket.io строит сверху (например, комнаты и пространства имен).

+0

В прошлый раз это был urlparser, все остальные части поддерживают unix-сокет, я проверю, что-нибудь изменилось с тех пор, как я посмотрел до –

+0

так же, как давно - fixes "здесь https://github.com/socketio/socket.io-client/blob/master/lib/url.js#L41 –

+0

Вы правы. Но похоже, что их «сломанный» 'url' используется только здесь: https://github.com/socketio/socket.io-client/blob/280246357908556dbe98f16d413e6b5030094485/lib/index.js#L44, что означает, что можно использовать патч обезьяны socket.io-client, изменив код функции 'lookup'. – ahwayakchih