NodeJs之Socket开发

我们用Telnet向指定端口发送socket指令

首先讲下telnet的语法

telnet [ip] [port]

举例:

telnet localhost 3000

按Ctrl+]键从 Telnet 会话模式转换到 Telnet 命令模式

send /who


nodejs Socket实例:

var net = require('net');

var sockets = [];
var name_map = new Array();
var chuck_quotes = [
    "There used to be a street named after Chuck Norris, but it was changed because nobody crosses Chuck Norris and lives.",
    "Chuck Norris died 20 years ago, Death just hasn't built up the courage to tell him yet.",
    "Chuck Norris has already been to Mars; that's why there are no signs of life.",
    "Some magicians can walk on water, Chuck Norris can swim through land.",
    "Chuck Norris and Superman once fought each other on a bet. The loser had to start wearing his underwear on the outside of his pants."
]

function get_username(socket) {
    var name = socket.remoteAddress;
    for (var k in name_map) {
        if (name_map[k] == socket) {
            name = k;
        }
    }
    return name;
}

function delete_user(socket) {
    var old_name = get_username(socket);
    if (old_name != null) {
        delete(name_map[old_name]);
    }
}

function send_to_all(message, from_socket, ignore_header) {
    username = get_username(from_socket);
    for (var i=0; i < sockets.length; i++ ) {
        if (from_socket != sockets[i]) {
            if (ignore_header) {
                send_to_socket(sockets[i], message);
            }
            else {
                send_to_socket(sockets[i], username + ': ' + message);
            }
        }
    }
}

function send_to_socket(socket, message) {
    socket.write(message + '\n');
}

function execute_command(socket, command, args) {
	console.log("command:"+command);
    if (command == 'identify') {
        delete_user(socket);
        name = args.split(' ', 1)[0];
        name_map[name] = socket;
    }
    if (command == 'me') {
        name = get_username(socket);
        send_to_all('**' + name + '** ' + args, socket, true);
    }
    if (command == 'chuck') {
        var i = Math.floor(Math.random() * chuck_quotes.length);
        send_to_all(chuck_quotes[i], socket, true);
    }
    if (command == 'who') {
		console.log("kkk");
        send_to_socket(socket, 'Identified users:');
        for (var name in name_map) {
            send_to_socket(socket, '- ' + name);
        }
    }
}

function send_private_message(socket, recipient_name, message) {
    to_socket = name_map[recipient_name];
    if (! to_socket) {
        send_to_socket(socket, recipient_name + ' is not a valid user');
        return;
    }
    send_to_socket(to_socket, '[ DM ' + get_username(socket) + ' ]: ' + message);
}
var s = net.Server(function(socket) {
    sockets.push(socket);
    socket.on('data', function(d) {
        data = d.toString('utf8').trim();
		//console.log(data);
        // check if it is a command
        var cmd_re = /^\/([a-z]+)[ ]*(.*)/g;
        var dm_re = /^@([a-z]+)[ ]+(.*)/g;
        cmd_match = cmd_re.exec(data)
		
	console.log(data);	
        dm_match = dm_re.exec(data)
        if (cmd_match) {
            var command = cmd_match[1];
            var args = cmd_match[2];
            execute_command(socket, command, args);
        }
        // check if it is a direct message
        else if (dm_match) {
            var recipient = dm_match[1];
            var message = dm_match[2];
            send_private_message(socket, recipient, message);
        }
        // if none of the above, send to all
        else {
            send_to_all(data, socket);
        };

    });
    socket.on('close', function() {
        sockets.splice(sockets.indexOf(socket), 1);
        delete_user(socket);
    });
});
s.listen(3000);

执行结果





Telnet 命令 
Telnet 命令允许您与使用 Telnet 协议的远程计算机通讯。运行 Telnet 时可不使用参数,以便输入由 Telnet 提示符 (Microsoft Telnet>) 表明的 Telnet 上下文。可从 Telnet 提示符下,使用 Telnet 命令管理运行 Telnet 客户端的计算机。 


Telnet 客户端命令提示符接受以下命令: 




命令 描述 
open 
使用 openhostname 可以建立到主机的 Telnet 连接。 


close 
使用命令 close 命令可以关闭现有的 Telnet 连接。 


display 
使用 display 命令可以查看 Telnet 客户端的当前设置。 


send 
使用 send 命令可以向 Telnet 服务器发送命令。支持以下命令: 


ao 


放弃输出命令。 


ayt 


“Are you there”命令。 


esc 


发送当前的转义字符。 


ip 


中断进程命令。 


synch 


执行 Telnet 同步操作。 


brk 


发送信号。 


上表所列命令以外的其他命令都将以字符串的形式发送至 Telnet 服务器。例如,sendabcd 将发送字符串 abcd 至 Telnet 服务器,这样,Telnet 会话窗口中将出现该字符串。 


quit 
使用 quit 命令可以退出 Telnet 客户端。 


set 
使用带有下列参数之一的 set 命令为当前会话配置 Telnet 客户端。 


bsasdel 


Backspace 将作为删除而发送。 


codeset option 


只有当语言设置为日语时才可用。将当前代码集设置为选项,可以为下列选项之一: 


? Shift JIS 


? Japanese EUC 


? JIS Kanji 


? JIS Kanji (78) 


? DEC Kanji 


? NEC Kanji 




应该在远程计算机上设置相同的代码集。默认情况下,Telnet 客户端使用光栅字体。使用这些代码集访问远程计算机之前,您必须配置 Telnet 客户端以使用 TrueType 字体,从而确保正确地显示字符。 


crlf 


新行模式:导致 Return 键发送 0x0D, 0x0A。 


delasbs 


Delete 将作为退格键发送。 


escapecharacter 


从 Telnet 会话模式转换到 Telnet 命令模式。当处于 Telnet 命令模式时,按 Enter 将会返回到 Telnet 会话模式。 


localecho 


打开 localecho。 


logfilename 


指定为该会话将 Telnet 日志写入到的文件的名称。如果不指定该文件的路径,将在当前目录中创建文件。指定日志文件还会启动日志记录。 


logging 


启动该会话的日志。 


mode {console | stream} 


操作的模式。 


ntlm 


启动 NTLM 身份验证。 


term {ansi | vt100 | vt52 | vtnt} 


您希望 Telnet Client 模拟的终端的类型。 





显示 set 的帮助信息。 


unset 
使用 unset 命令可以关闭先前使用 set 命令设置的选项。 


status 
使用 status 命令可以确定运行 Telnet 客户端的计算机是否已成功连接。 


?/help 
显示“帮助”信息。 


FTP:文件传输协议。先说说他的功能吧,主要就是从运行FTP服务器的计算机传输文件。可以交互使用。这里要注意,只有安装了tcp/ip协议的机器才能使用ftp命令。 
命令格式:ftp [-v][-d][-i][-n][-g][-s:filename][-a][-w:windowsize][computer] 


说说他们的含义吧。 
-v 不显示远程服务器响应 
-n 禁止第一次连接的时候自动登陆 
-i 在多个文件传输期间关闭交互提示 
-d 允许调试、显示客户机和服务器之间传递的全部ftp命令 
-g 不允许使用文件名通配符,文件名通配符的意思是说允许在本地文件以及路径名中使用通配字符 
-s:filename 指定包含ftp命令的文本文件。在ftp命令启动后将自动运行这些命令。在加的参数里不能有空格。 
-a 绑定数据连接时,使用任何的本地端口 
-w:windowsize 忽略默认的4096传输缓冲区 
computer 指定要连接的远程计算机的ip地址 


你可能感兴趣的:(Node.Js)