客户端和服务器端完成消息协议定义之后,我们就可以分别实现消息的构建和消息的解析,下面我们首先分析服务器端如何对客户端发来的消息进行解析。之前我们介绍,当客户端连接到服务器之后,就会触发服务器的connection事件,在这个事件的处理函数中,其参数就是一个socket对象,通过对这个Socket对象添加data事件处理,我们就可以接收来自客户端的数据。我们通过对不同的命令码来实现对消息的解析。对于客户端发送的消息,我们首先需要执行的是将消息进行分割,通过分割我们可以得到每一个消息域,比如add消息:
add|www.jiesoon.com|jiesoon|jiesoon@jiesoon.com|3|3000
我们使用“|”对这个消息进行分割,分割之后便会得到一个大小为6的数组,其内容:
view plaincopy to clipboardprint?
fields = ['add',
'www.jiesoon.com',
'jiesoon',
'jiesoon@jiesoon.com',
'3',
'3000'
]
我们在上一节定义了每一个消息的格式,那么在解析消息的时候,我们可以根据不同的命令进行不同的解析。因此,我首先需要做的是判断这个消息是什么类型的消息,如何判断呢?直接取得分割后的第一个元素fields[0],通过这个数值再与命令码进行比较即可,如下:
view plaincopy to clipboardprint?
switch(fields[0]){
case 'add':
break;
case 'find':
break;
case 'edit':
break;
case 'remove':
break;
default:
console.log('Unknown message');
}
在上述的代码中,我们通过第一个消息域的内容与各个命令码进行比较,如果比较的结果相等,那么就会执行后续的代码。
add消息
add消息是向服务器中添加一个网站信息,它含有6个消息域。在执行消息分割之后,并确认了其为add消息,那么我们首先会判断这个域是否为6个消息域,如果发现其包含的消息域个数不符,那么我们就认为是一个非法的消息,不需要在进行处理;如果消息合法,那么我们会提取出这个网站的5个信息:域名,名称,联系人的电子邮件地址,网站的年龄和点击量。有了这个5个信息之后,我们就可以创建一个WebSite对象,将这个信息构建为一个WebSite,通过数组的push方法将其保存到一个数组中,见下面的代码:
view plaincopy to clipboardprint?
//add|www.jiesoon.com|jiesoon|jiesoon@jiesoon.com|3|3000
if(fields.length != 6){
console.log("Invalid fields");
break;
}
var domainName = fields[1];
var name = fields[2];
var email = fields[3];
var age = fields[4];
var click = fields[5];
var website = {};
website.domainName = domainName;
website.name = name;
website.email = email;
website.age = age;
website.click = click;
websites.push(website);
find消息
find消息是对给定的网站域名在当前的服务器上执行查找操作,如果在服务器中找到一个域名与给定的域名相等,那么就表示这个网站存在于当前的服务器中,通过打印出一条消息给出这个网站信息所在的索引位置。这个find消息与上面的add消息不同,它只包含有两个消息域:edit命令码和待查找的域名。所以在确认find消息的时候,我们只需要判断所得到的消息域的长度是否为2就可以了。如果条件符合,那么我们就遍历当前的websites数组,依次获取一个WebSite对象,并取得这个对象的域名信息,再与传入的域名进行比较,根据比较的结果来决定是否找到对应的网站。
view plaincopy to clipboardprint?
//find|www.jiesoon.com
if(fields.length != 2){
break;
}
var domainName = fields[1];
for(var i = 0; i < websites.length; i++){
console.log(domainName + ":" + websites[i].domainName);
if(domainName === websites[i].domainName){
console.log("find at " + i);
break;
}
}
break;
edit消息
edit消息是对指定的网站信息进行修改,这个“指定的网站信息”是通过这个edit消息决定的。也就是这个消息的第二个域。这个edit消息相对于add消息,其内容还要多一个域名信息,这个信息就是用来进行查找的。之后才是更新后的网站域名信息。对于这个消息的解析,首先是判断edit消息的消息域个数,正确的个数应该为7,如果结果不匹配,那么将不会执行后续的修改操作。查找的操作与上述的方法一直, 从第一个元素开始遍历整个数组,知道找到对应的元素位置。对于修改操作,我们去掉了像add消息解析中的5个变量,直接使用fields中的后5个元素作为网站的域名信息。
本软件是会员软件,如果你是会员,
请登陆。如果不是会员
请注册。