2015-04-23 3 views
1

Я хочу настроить простой коммуникационный разъем для отправки сообщений с моего локального компьютера (Windows) на мой экземпляр AWS EC2 через командную строку. У меня уже установлена ​​настройка EC2 и узел. Моя борьба определяет, какой порт/хост использовать для этого общения. Пожалуйста, смотрите следующее:Настройка простого сервера/клиентского сокета для связи на AWS EC2

server.js (работает на AWS EC2):

var net = require('net'); 

var HOST = '127.0.0.1'; 
var PORT = 8080; 

// Create a server instance, and chain the listen function to it 
// The function passed to net.createServer() becomes the event handler for the 'connection' event 
// The sock object the callback function receives UNIQUE for each connection 
net.createServer(function(sock) { 

    // We have a connection - a socket object is assigned to the connection automatically 
    console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort); 

    // Add a 'data' event handler to this instance of socket 
    sock.on('data', function(data) { 

     console.log('DATA: ' + data); 
     // Write the data back to the socket, the client will receive it as data from the server 
     sock.write('You said: "' + data + '"'); 

    }); 

    // Add a 'close' event handler to this instance of socket 
    sock.on('close', function(data) { 
     //console.log('CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort); 
    }); 

}).listen(PORT, HOST); 

console.log('Server listening on ' + HOST +':'+ PORT); 

client.js (работает на моем местные окна машины):

var net = require('net'); 

var HOST = '127.0.0.1'; 
var PORT = 8080; 

var client = new net.Socket(); 
client.connect(PORT, HOST, function() { 

    console.log('CONNECTED TO: ' + HOST + ':' + PORT); 
    // Write a message to the socket as soon as the client is connected, the server will receive it as message from the client 
    client.write('I am Chuck Norris!'); 

}); 

// Add a 'data' event handler for the client socket 
// data is what the server sent to this socket 
client.on('data', function(data) { 

    console.log('DATA: ' + data); 
    // Close the client socket completely 
    client.destroy(); 

}); 

// Add a 'close' event handler for the client socket 
client.on('close', function() { 
    console.log('Connection closed'); 
}); 

Примечание , что я установил свою группу безопасности следующим образом: enter image description here

Обратите внимание, что, когда я запускаю код, приведенный выше, выход EC2 является: «Сервер прослушивает 127.0.0.1:8080»

Однако client.js работает на моей машине Windows, имеет следующую ошибку: enter image description here

Этот простой пример работает, когда server.js и client.js запускаются локально. Пожалуйста, предоставьте какие-либо рекомендации для помощи, чтобы я мог отправлять простые сообщения между моей машиной Windows и моим экземпляром EC2.

+1

Если вы слушаете порт 8080, вам не следует открывать его в группе безопасности, чтобы разрешить вызов? Используйте «Telnet machine_IP 8080», чтобы проверить, можете ли вы связаться с сервером на этом порту или нет. Если нет, то возникает проблема сети (например, группы безопасности). –

+0

@AdamOcsvari опубликуйте это как ответ вместо комментария, чтобы он мог его принять. Это правильный ответ, почему он не может подключиться из-за пределов своей группы безопасности на порт 8080. –

+1

@greg_diesel, вы ошибаетесь. Да, правило должно быть там, но отсутствующее правило группы безопасности будет * никогда не вызывать «отказ в соединении», и добавление правила не решит это, если введенный код является точным. Недопустимое правило приведет к таймауту, потому что ничто не отправляет пакет TCP 'RST', если группа безопасности недостаточно открыта. Входящий пакет просто отбрасывается, что приводит к ошибке «время ожидания соединения» - очень отличный режим отказа. Введенный код использует адреса интерфейса loopback и не может работать между разными хостами. –

ответ

5

Вы никогда не сможете подключиться ко всему, что прослушивает 127.0.0.1 вне машины. Это интерфейс loopback, доступный только из самой машины ... что объясняет, почему он работает локально.

Вы видите «соединение отказано» - не потому, что вы не можете получить доступ к экземпляру EC2, а потому, что вы не пытаетесь. Вы пытаетесь получить доступ к слушателю на своем локальном компьютере, где он не прослушивает.

На сервере свяжите (прослушивайте) на хосте 0.0.0.0 и на клиенте подключитесь к общедоступному IP-адресу сервера (или приватному, если у вас есть VPN).

И, как уже упоминалось в комментариях, вам также необходимо разрешить TCP-порт 8080 во входящей группе безопасности или вы получите ошибку «время ожидания соединения», так как пакеты будут отброшены (не отклонены, просто отброшены) в край сети EC2 без правила соответствия во входящей группе безопасности.

+0

Большое спасибо за не только быстрый, но правильный ответ. – Erik

Смежные вопросы