NodeJs 使用TCP套接字收發資料的簡單例項

2022-07-20 02:30:17 字數 2500 閱讀 5385

因為tcp協議是流協議,在收發資料的時候會有粘包的問題。本例使用自定義的sptcp封包協議對tcp資料再進行一次封裝,解決了粘包問題。

注:其效能仍有待優化。優化方向:使用tcp自帶的接收視窗快取。

/**

* script: sptcp.js

* description: 簡單封包協議sptcp類

* authors: [email protected]

* date: 2016-04-14

*/var util = require('util');

function sptcp(socket) ;

//裁剪接收快取

_sp_rcv_buf = _sp_rcv_buf.slice(sptcp.sp_header_length);

//解析包體

_sp_parse_step = sptcp.sp_parse_step.body;

_spparsebody(func);}};

//解析包體方法

function _spparsebody(func) catch(e)

//清空包頭和包體

_sp_header = null;

_sp_body = null;

//解析下乙個包

_sp_parse_step = sptcp.sp_parse_step.header;

_spparsesppacket(func);}};

//接收資料

this.spreceivedata = (data, func) => else if (_sp_parse_step == sptcp.sp_parse_step.body)

};//傳送資料

this.spsenddata = msg => ;

//銷毀方法

this.spdestroy = () => ;

}//包頭長度,單位位元組

sptcp.sp_header_length = 4;

//解析所處的階段

sptcp.sp_parse_step = ;

exports.sptcp = sptcp;

/**

* script: spsvr.js

* description: sptcp伺服器端

* authors: [email protected]

* date: 2016-04-15

*/var util = require('util');

var net = require('net');

var sptcp = require('./sptcp').sptcp;

var server = net.createserver(client => );

});//監聽結束事件

client.on('end', () => );

//監聽錯誤事件

client.on('error', err => );

});var listen_options = ;

util.log('listen options: ' + util.inspect(listen_options));

server.listen(listen_options, () => );

/**

* script: spcli.js

* description: sptcp客戶端

* authors: [email protected]

* date: 2016-04-15

*/var util = require('util');

var net = require('net');

var sptcp = require('./sptcp').sptcp;

var connect_options = ;

util.log('connect options: ' + util.inspect(connect_options));

var client = net.connect(connect_options, ()=>);

});//監聽結束事件

client.on('end', () => );

//監聽錯誤事件

client.on('error', err => );

//傳送訊息

for (var i=0; i<10; i++) ;

client.spsenddata(msg);

}//關閉連線

client.end();

});

優化方案1:接收快取_sp_rcv_buf改為buffer陣列,並記錄陣列元素的長度和_sp_rcv_length。這樣做的好處有兩點,一點是不用每次收到資料就執行一次concat方法分配一塊新的記憶體;一點是在執行concat方法時直接傳入長度引數,加快該方法的執行速度。——於2016-04-16

優化方案2:將類的方法定義在prototype原型物件上,這樣該類的所有例項就共用同乙個方法副本,節約資源。——於2016-04-19

socket套接字 TCP使用

使用流程 建立套接字 connect鏈結tcp伺服器 命令 socket物件.connect 伺服器ip,伺服器port 3.收 發資料recv 接收資料的大小 send 傳送資料 4.關閉套接字 import socket def main 建立socekt物件 tcp socket socket...

使用套接字建立連線 TCP

int socket int domain,int type,int protocol domain pf inet,pf inet6以及pf local等,表示什麼型別的套接字 type sock stream 表示位元組流,tcp sock dgram 表示資料報,udp sock raw 表示...

TCP的套接字

摘自 深入理解計算機網路 王達著 機械工業出版社 1.ipv4資料報頭部格式 2.ipv6資料報頭部格式 3.ipv4資料報的封裝與解封裝 4.ipv4資料報的分段與重組 5.arp協議報文格式及arp表 6.arp位址解析原理 7.icmp協議及報文格式 8.ipv6協議族的其它協議 9.tcp的...