Node.js学习日记(五):TCP

275 阅读2分钟
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)和使用的端口号),然后按两下回车键,获得响应报文。

image.png

二、基于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真的太狗了,字符输出,行输出模式下面看不到交互信息,暴躁了,这节就这样。