最近在學習node,其中一個很感興趣的項目是制作聊天工具。
起初是建立服務端與客戶端的一個socket連接,然后互相發(fā)消息,
現(xiàn)在想做兩個客戶端之間通訊,問題來了..
clients變量是一個數(shù)組,里面存儲了socket對象,一旦有新的連接那么就會把新的socket對象push進去,
如果做群發(fā)消息的話,只要給clients遍歷然后發(fā)消息,那么每個客戶端都能收到消息,
現(xiàn)在的問題是我想做客戶端與客戶端之間的通訊,那么就要從這個數(shù)組中取出這個特定的客戶端, 請問怎么能拿出那個特定的客戶端?
問題轉(zhuǎn)化成了怎么成數(shù)組中拿出這個特定的對象..
下圖這樣寫會報錯
附上全部源代碼:
server.js:
// 建立一個Socket服務端
const net = require('net');
// 用于存儲所有的連接
var clients = [];
var server = net.createServer((socket) => {
//socket對象push進去
clients.push(socket);
console.log(`${socket.remoteAddress}上線了,當前在線${clients.length}人`);
socket.on('data',clientData).on('error',(err)=>{
clients.splice(clients.indexOf(socket),1);
console.log(`${socket.remoteAddress} 下線了 當前在線${clients.length}人`);
});
//廣播方法
function broadcast(signal){
console.log(signal);
// 肯定有用戶名和消息
var username = signal.from;
var message = signal.message;
// 我們要發(fā)給客戶端的東西
var send = {
protocal:signal.protocal,
from:username,
message:message
};
// 廣播消息
clients.forEach(client => {
client.write(JSON.stringify(send));
});
}
//點對點消息
function p2p(signal){
console.log(signal);
// 肯定有用戶名和消息
var username = signal.from;
var target = signal.to;
var message = signal.message;
// 我們要發(fā)給客戶端的東西
var send = {
protocal:signal.protocal,
from:username,
message:message
};
console.log(`${username}要發(fā)給${target}的內(nèi)容是${message}`);
// 發(fā)送消息
//clients[target].write(JSON.stringify(send));
}
function clientData( chunk) {
// chunk:broadcast|張三|弄啥咧!
// 協(xié)議 用戶名 消息
// chunk:{'protocal':'broadcast','from':'張三','message':''}
// chunk:{'protocal':'p2p',from:'張三',to:'李四',message':''}
try {
var signal = JSON.parse(chunk.toString().trim());
var protocal = signal.protocal;
switch (protocal) {
case 'broadcast':
broadcast(signal);
break;
case 'p2p':
console.log('接收到了p2p消息!');
p2p(signal);
break;
case 'shake':
shake(signal);
break;
default:
socket.write('協(xié)議的protocal字段有問題!');
break;
}
// var username = signal.from;
// var message = signal.message;
}
catch (err) {
socket.write('數(shù)據(jù)格式有問題!');
throw err;
}
// 有任何客戶端發(fā)消息都會觸發(fā)
// var username = chunk.username;
// var message = chunk.messge;
// broadcast(username.message)
};
});
var port = 2080;
server.listen(port, (err) => {
if (err) {
console.log('端口被占用了');
return false;
}
console.log(`服務器正常啟動監(jiān)聽【${port}】端口`);
});
client.js:
//客戶端
const net = require('net');
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('What is your name? ', (name) => {
name = name.trim();
if (!name) throw new Error('姓名有問題!');
//創(chuàng)建與服務端的連接
//還可以傳入一個參數(shù)host:192.xx...
var socket = net.createConnection({ port: 2080 }, () => {
//登入操作;
var user = {
protocol: 'signin',
username: name
}
console.log(`Welcome ${socket.remoteAddress} ${name} to 2080 chatroom`);
//監(jiān)聽服務端發(fā)過來的數(shù)據(jù)
socket.on('data', (chunk) => {
try {
var signal = JSON.parse(chunk.toString().trim());
var protocal = signal.protocal;
switch (protocal) {
case 'broadcast':
console.log(`[broadcast]"${signal.from}"說了:${signal.message}`);
rl.prompt();
break;
case 'p2p':
console.log(`[p2p]${signal.from}說了:${signal.message}`);
rl.prompt();
break;
default:
server.write('數(shù)據(jù)協(xié)議字段有問題');
break;
}
}
catch (err) {
socket.write('數(shù)據(jù)格式有問題!');
throw err;
}
});
rl.setPrompt(`${name}> `);
rl.prompt();
rl.on('line', (line) => {
line = line.toString().trim();
var temp = line.split(':');
var send;
if (temp.length === 2) {
//點對點消息
console.log('這是一個點對點消息');
send = {
protocal: 'p2p',
from: name,
to: temp[0],
message: temp[1]
};
} else {
//廣播消息
// chunk:{'protocal':'broadcast','from':'張三','message':''}
send = {
protocal: 'broadcast',
from: name,
message: line.toString().trim()
};
}
socket.write(JSON.stringify(send));
rl.prompt();
}).on('close', () => {
console.log('Have a great day!');
process.exit(0);
});
});
});
使用:
--node server.js
--node client.js
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術與教育服務機構(gòu),發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。