저는 다중 사용자 스케치북을 만들고 현재 연결된 모든 사용자의 업데이트 된 목록을 가져오고 유지하는 데 문제가 있습니다. 나는 새로운 고객의 모든 기존 고객에게 알리고, 기존 클라이언트를 새로 연결된 고객에게 전달하는 가장 좋은 방법을 찾고있다. 이 작업을 수행하려는 이유는 한 클라이언트가 선을 그릴 때 모든 다른 클라이언트가 목록에서 해당 클라이언트를 찾은 다음 해당 선 배열을 각 배열에 추가하기 때문입니다.웹 소켓을 사용하는 클라이언트 목록 얻기
Server.js
var sys = require("sys");
var ws = require('websocket-server');
var server = ws.createServer({debug: true});
server.addListener("connection", function(conn) {
// When a message is received, broadcast it too all the clients
// that are currently connected.
conn.send('NEW_SERVER_MESSAGE:Welcome!');
conn.send('USER_CONNECTED:' + conn.id);
conn.addListener("message", function(msg){
switch(msg) {
case 'GET_ALL_ACTIVE_USERS':
server.manager.forEach(function(con) {
conn.broadcast('USER_CONNECTED:' + con.id);
});
break;
case 'UPDATE_CURSOR':
conn.broadcast(msg + '_' + conn.id);
break;
default:
conn.broadcast(msg);
break;
}
});
conn.addListener('close', function(msg) {
conn.broadcast('USER_DISCONNECTED:' + conn.id);
});
});
server.addListener("error", function(){
console.log(Array.prototype.join.call(arguments, ", "));
});
server.addListener("listening", function(){
console.log("Listening for connections...");
});
server.addListener("disconnected", function(conn){
console.log("<"+conn.id+"> disconnected.");
});
server.listen(8002);</code>
내 JS 네트워크 번호 : 순간
sketchPadNet = function (b,s) {
var self = this;
this.host = "ws://localhost:8002/server.js";
this.id = null;
this.users = [];
this.heightOffset = 53;
this.scene = s;
this.connected = b;
var User = function(id) {
this.id = id;
this.nickname = id;
this.lines = [];
this.position = "";
};
this.init = function() {
try {
socket = new WebSocket(self.host);
socket.onopen = function (msg) {
socket.send('GET_ALL_ACTIVE_USERS');
};
socket.onmessage = function (msg) {
var m = msg.data.split(':');
switch(m[0]) {
case 'USER_CONNECTED':
console.log('USER_CONNECTED');
var u = new User(m[1]);
u.lines = [];
u.nickname = u.id;
self.users.push(u);
console.log(self.users.length);
console.log(self.users);
break;
case 'USER_DISCONNECTED':
console.log('USER_DISCONNECTED');
for(var i = 0; i < self.users.length; ++i) {
console.log(self.users[i]);
if(m[1] == self.users[i].id) {
self.users.splice(i, 1);
}
}
break;
case 'DRAW_LINE':
var tmpMsg = m[1].split('_');
var id = tmpMsg[8];
var userIndex = '';
for(var i = 0; i < self.users.length; ++i) {
if(self.users[i].id == id) userIndex = i;
}
var p1 = (self.users[userIndex].lines.length < 1) ? new BLUR.Vertex3(tmpMsg[0], tmpMsg[1], tmpMsg[2]) : self.users[userIndex].lines[self.users[userIndex].lines.length - 1].point2;
var p2 = new BLUR.Vertex3(tmpMsg[3], tmpMsg[4], tmpMsg[5]);
var line = new BLUR.Line3D(p1, p2, tmpMsg[7]);
line.material = tmpMsg[6];
// add the newly created line to the scene.
self.scene.addObject(line);
self.users[userIndex].lines.push(line);
break;
case 'UPDATE_CURSOR':
for(var i = 0; i < self.scene.objects.length; ++i) {
if(self.scene.objects[i].type == 'BLUR.Particle')
self.scene.removeObject(scene.objects[i]);
}
var coords = m[1].split('_');
var id = coords[2];
var userIndex = 0;
for(var i = 0; i < self.users.length; ++i) {
if(self.users[i].id == id)
userIndex = i;
}
self.users[userIndex].position = new BLUR.Vertex3(coords[0], coords[1], 1);
var p = new BLUR.Particle(self.users[userIndex].position, 4);
p.material = new BLUR.RGBColour(176,23,31,0.3);
self.scene.addObject(p);
break;
case 'RECEIVE_ID':
self.id = m[1];
self.connected.nicknameObj.text = self.id;
console.log(self.id);
break;
break;
}
};
socket.onclose = function (msg) {
// feck!
self.connected.addServerError('Server disconnected, try refreshing.');
};
}
catch (ex) {
console.log('EXCEPTION: ' + ex);
}
};
은, 새로운 클라이언트가 접속 될 때 메시지를 전송하고, 어레이에 첨가하고, 상기 역방향 클라이언트가 연결을 끊을 때 이것이 업데이트를 유지하고 있지는 않지만 어떤 이유로? 내가 여기 믿을 수 없을만큼 바보 야하는 경우
Uncaught TypeError: Cannot read property 'lines' of undefined
죄송합니다,하지만 어떤 도움이 감사합니다! : 클라이언트가 선을 그릴 때 예를 들어, 다른 사람의 일부는이 오류를보고
건배 :)
그래서 서버 측에서 자바 스크립트를 사용하고 있습니까? 어떤 종류의 프레임 워크/컨테이너를 사용하고 있습니까? –
Im는 Node.js를 https://github.com/miksago/node-websocket-server와 함께 사용하고 있습니다. – harrynorthover