2012-04-18 5 views
1

지난 주 동안이 특정 문제를 검색해 봤는데 주제에 대한 정보를 찾을 수 없어서 (구식이 아니 었습니다) 방금 결정했습니다. 다른 일에 종사하십시오. 그러나 이제는 node.js와 socket.io를 사용하여 서버에 연결된 ID를 사용하여 특정 클라이언트에 데이터 (구성한 데이터)를 보낼 수 있어야합니다. 각 새 연결에 대해 객체에 이미 ID를 저장합니다. 내가 알아야 할 것은 내가 선택한 연결 ID로 그것을 보내는 방법입니다.Node.JS Socket.IO 특정 연결 ID로 패킷을 전송합니다.

다음과 같이하십시오. function send (data, client.id) {};

TCP가 아닌 http 서버를 사용하고 있습니다.

이것이 가능합니까?

편집 :

server = http_socket.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    res.end(respcont); 
    client_ip_address = req.header('x-forwarded-for'); 
    }); 
socket = io.listen(1337); // listen 
//============================================= 
// Socket event loop 
//============================================= 
socket.on ('connection', function (client_connect) { 
    var client_info = new client_connection_info();  // this just holds information 
    client_info.addNode(client_connect.id, client_connect.remoteAddress, 1); // 1 = trying to connet 

    var a = client_info.getNode(client_connect.id,null,null).socket_id; // an object holding the information. this function just gets the socket_id 
    client_connect.socket(a).emit('message', 'hi'); 

    client_connect.on('message', function (data) { 
     }); 
    client_connect.on ('disconnect', function() { 

    ); 
}); 

솔루션 : 나는 당신이 할 일을하는 것은 (내가하고있는 것처럼)이 소켓을 저장할 수 있는지가 아닌 socket.id을 만들어 사용하는 것입니다 ... 단지 실험하여 알아 냈어 그 대신에. 이 작업을 수행해야하는 경우

client_info.addNode(client_connect.id, client_connect.remoteAddress, client_connect, 1) 

var a = client_info.getNode(client_connect.id,null,null,null).socket; 
    a.emit('message', 'hi'); 
+0

HTTP는 TCP 연결을 통해 작동하는 프로토콜입니다. TCP는 IP를 사용하는 프로토콜로, 주로 전기 또는 광 신호를 사용하는 이더넷을 사용합니다. –

+0

아 감사합니다. 나는 http 버전보다는 TCP 버전에 대한 도움을 받고 싶지 않았다. 실제로, 나는 방금 전에 그것에 대해 알았다! :) – user1328762

답변

1

이 할 수있는 가장 쉬운 방법은 연결에 ID를 매핑하는 글로벌 연관 배열을 구축하고 유지하는 것입니다 : 당신은 당신이 필요할 때마다 다음 적절한 연결을보고 그냥 일반을 사용할 수 있습니다 기능을 보냅니다. 배열에서 연결을 제거하는 데 약간의 논리가 필요 하겠지만 너무 괴롭지 않아야합니다.

+0

node.js와 socket.io의 최신 버전에서 가능했기 때문에 내가하고 싶은 일을 성취 할 수있는 방법이 있어야한다는 것을 알고 있습니다. 편집 : 나는 이미 연결 ID를 저장하고, 그 외에 어떤 것을 저장해야합니까? – user1328762

+0

나는 네 답을 받아 들였다. 나는 당신이 전하려고 한 것을 이해하지 못했습니다. – user1328762

+0

@Femi 확장성에 대해 생각하지 않는다면 좋은 해결책입니다. 여러 컴퓨터에서 작동하게하는 것은 정말 어려울 것입니다. – freakish

1

예, 가능합니다.

io.sockets.socket(id).emit('message', 'data'); 
+0

흠, 나는 그것을 작동시키지 않는 것 같다. 아프다. 내 코드를 어떻게 호출하는지 업데이트하라. – user1328762

0

솔루션에는 하나의 큰 단점이 있습니다. 앱이 하나의 머신을 더 필요로 할 때 당신은 무엇을 할 것인가? 내부 ID를 사용하는 것도 어려울 수 있습니다. 외부 ID (예 : 사용자 이름)를 사용하여 조언합니다.

마찬가지로 this post 방을 사용하는 조언 (크기 조정을 허용하려면 Redis와 함께). 모든 새 소켓에 개인 실을 추가하십시오 (예 : 사용자 이름 기반). 코드는 다음과 같을 수 있습니다.

이 솔루션을 사용하면 여러 컴퓨터에서 모든 사용자에게 이벤트를 보낼 수 있습니다. 또한 제 의견으로는 아주 간단하고 우아합니다.

+0

서버 게임 엔진 용 솔루션을 사용할 수 없습니다. 소켓과 데이터베이스 정보로 모든 플레이어에 대한 객체를 만들어야합니다. – user1328762

+1

물론 가능합니다. 주어진 소켓과 관련된 데이터를 저장하기 위해서 JSON 인코딩과 함께'socket.set'과'socket.get'을 사용할 수 있습니다. 당신은 컨셉을 뒤집어 야합니다 : 정보를 소켓 안에 저장하지 말고 (좋음), 정보 안에 소켓을 넣지 마십시오. – freakish

관련 문제