Node HTTP服务器构建在Node TCP服务器之上,也就是说Http.server继承于net.Server
首先我们用Node.js写一个简单的服务器
const http=require('http');
const server=http.createServer(function(req,res){
res.writeHead(200,{'Content-Type':'text/html'})
res.end('<h1>hello</h1>')
console.log("new connection!")
})
server.listen(port=3001, hostname='localhost', () => {
console.log(`server running at http://${hostname}:${port}/`);
});
这个服务器开启时会输出它所在的端口和主机名称,当有客户端连接时,它会在控制台输出“new connection”。
一、用telnet测试
telnet 命令使用 TCP 协议,一般用于远程登录(明文传输,不安全,已经被 SSH 替代了),也可以查看指定端口的连通性。ping基于ICMP协议,这个协议可以被禁止。
telnet真的太古老了,在win下摸索了半天才知道他的用法,一开始还以为自己装错了
1.开启telnet客户端的服务
在控制面版中,点开程序,选择启用或者关闭Windows服务,选择telnet客户端,重启电脑。
2.测试指定端口的联通性
输入 telnet localhost 3001 进入黑屏,输入ctrl+]进入telnet命令行,再继续按回车进入黑屏,输入GET / HTTP/1.1,创建一个HTTP请求,即一个套接字(绑定通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号),然后按两下回车键,获得响应报文。
二、基于TCP的聊天程序
1.客户端交互
在windows系统下,回车式的换行符号是"\r\n",Mac系统里,每行结尾是“<回车>”,即"\r",但是在Linux等系统下是没有"\r"符号的。
const net=require('net');
var count=0
const server=net.createServer(function(conn){
conn.write('> hello welcome!'+'\r\n'+
'> '+count+' other people are connected at this time'+
'\r\n'+'> please write your name and enter');
count++
})
server.listen(port=3001, hostname='localhost', () => {
console.log(`server running at http://${hostname}:${port}/`);
});
2.设置昵称和发布消息
const net=require('net');
var count=0
,users={}
const server=net.createServer(function(conn){
conn.write('> hello welcome!'+'\r\n'+
'> '+count+' other people are connected at this time'+
'\r\n'+'> please write your name and enter: ');
count++;
var nickname;
conn.setEncoding('utf8')
conn.on('data',function(data){
console.log(data)
//data=data.replace('\r\n','')
if(!nickname){
if(users[data]){
conn.write('\033[93m> nickname already in use. try again \033[39m\r\n')
return
}else{
conn.write('\r\n')
nickname=data;
users[nickname]=conn
for(var i in users){
users[i].write('\033[90m >'+nickname+'joined the room \033[39m\r\n')
}
}
}
else{
for(var j in users){
if(j!==nickname){
users[j].write('\033[90m >'+nickname+' \033[39m'+data+'\r\n')
}
}
}
})
conn.on('close',function(){
count--;
//delete users[nickname]
})
})
server.listen(port=3001, hostname='localhost', () => {
console.log(`server running at http://${hostname}:${port}/`);
});
本来是想好好写的,telnet真的太狗了,字符输出,行输出模式下面看不到交互信息,暴躁了,这节就这样。