网络基础 - TCP

博客分类: 江河计划

网络基础 - TCP

1.算法

冒泡排序

var arr = [3,4,5,1,2,4,9,5,7,3]
Array.prototype.bubble = function(){
	for(var i=0; i<this.length; i++){
		for(var j=i; j<this.length; j++){
			if(this[i] > this[j]){
				var swap = this[i];
				this[i] = this[j];
				this[j] = swap;
			}
		}
	}
	return this;
}
arr.bubble()

2.正则

邮箱:/[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+.[a-zA-Z0-9_-]+/

手机号:/^1(3|4|5|7|8)\d{9}$/

3.整理知识:TCP

三次握手

http://www.cnblogs.com/zmlctt/p/3690998.html

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

  1. 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
  2. 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
  3. 三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据。

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

四次挥手

  1. 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。
  2. 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
  3. 服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。
  4. 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

4.周一读报

移动端字体放大问题的研究:https://juejin.im/post/59f678d7f265da43333dabb7

iOS:

body {
  		-webkit-text-size-adjust: 100% !important;
}

android:

var originRootFontSize = parseInt(window.getComputedStyle(document.documentElement, null).getPropertyValue('font-size'));
document.documentElement.style.fontSize = originRootFontSize * scaleFactor * scaleFactor + 'px';

微信端:

(function() {
   	if (typeof WeixinJSBridge == "object" && typeof WeixinJSBridge.invoke == "function") {
 		handleFontSize();
	} else {
    	document.addEventListener("WeixinJSBridgeReady", handleFontSize, false);
	}
	function handleFontSize() {
    	// 设置网页字体为默认大小
    	WeixinJSBridge.invoke('setFontSizeCallback', { 'fontSize' : 0 });
    	// 重写设置网页字体大小的事件
    	WeixinJSBridge.on('menu:setfont', function() {
      	WeixinJSBridge.invoke('setFontSizeCallback', { 'fontSize' : 0 });
    	});
	}
 	})();

chrome debugger

  • 打印数组对象:console.table();
  • 打印时间差:console.time(‘Timer1’); console.timeEnd(‘Timer1’);
  • 打印堆栈:console.trace(‘trace car’)
  • 打印监控:monitor

下周解决问题蓝牙及 ArrayBuffer 相关知识

整体流程梳理

  1. 了解小程序的文档实现,一下步骤都需要预防失败
  2. 打开蓝牙 wx.openBluetoothAdapter,这步之后任何情况的失败都需要关闭蓝牙设备,调用 wx.closeBluetoothAdapter
  3. 开始搜索周围的蓝牙设备,wx.startBluetoothDevicesDiscovery,这步之后任何情况下的失败都需要停止蓝牙搜索,调用 wx.stopBluetoothDevicesDiscovery
  4. 此时获取一下蓝牙的状态,res.discovering && res.available 是否可用,是否可搜索
  5. 开始获取周围蓝牙设备,这里应该是一个循环,需要有循环次数,当搜索到匹配的蓝牙设备为止,匹配到对应的蓝牙设备之后,停止搜索,搜索很耗资源,调用 wx.stopBluetoothDevicesDiscovery
  6. 每个蓝牙设备对象会有一个 advertisData 属性,这个属性是一段 ArrayBuffer,无法打印,需要转换成 Hex 字符串,buffer 转换出来是 16 进制数,需要转成 16 进制的字符串。得到 128 字节的字符串,如果是各位,首位补齐一个 0
  7. 此时会得到蓝牙设备的 deviceId,连接蓝牙设备,wx.createBLEConnection,这步之后需要绑定一下蓝牙设备状态变化,wx.onBLEConnectionStateChange,如果状态已经改变成断开,认为蓝牙失败
  8. 通过 wx.getBLEDeviceServices 获取蓝牙的 serviceId,可能会有多个,不同协议 UUID 不同,iOS 即使已经有 serviceId 也需要调用这步,否则后续无法继续
  9. 通过 wx.getBLEDeviceCharacteristics 获取 characteristicId,这个会分读写,我猜类似于接口,会有不同的标识符表示当前的 characteristicId 是读的,还是可写入的
  10. 通过调用 wx.notifyBLECharacteristicValueChange 开始通信,这个类似于 TCP 三次握手,建立通信之后就可以进行读写了
  11. 每次发送消息或者读取消息之前,都需要先绑定回调来接收,wx.onBLECharacteristicValueChange 相当于绑定回调,一次接受完之后应该是会自动销毁。
  12. 通过 wx.writeBLECharacteristicValue 对蓝牙设备发送消息,value 字段需要是一个 ArrayBuffer,锁的结果会回调 onBLECharacteristicValueChange 中的回调方法。

ArrayBuffer 转化

ArrayBuffer 是一段内存,每个字节存储一堆进制数,相同信息下,二进制更为紧凑,所以一般会存一些二进制数据,我们想要读取数据都希望把数据进行转换,一般转换成 16 进制比较适合看,下面是 ArrayBuffer 和 hex 之间的相互转化。

arrayBufferToHexString(buffer) {
   	let bufferType = Object.prototype.toString.call(buffer)
 	if (buffer != '[object ArrayBuffer]') {
    	return
	}
	let dataView = new DataView(buffer)

 	var hexStr = '';
	for (var i = 0; i < dataView.byteLength; i++) {
  	var str = dataView.getUint8(i);
    	var hex = (str & 0xff).toString(16);
    	hex = (hex.length === 1) ? '0' + hex : hex;
   	hexStr += hex;
	}
	return hexStr.toUpperCase();
  	}
hexStringToArrayBuffer(str) {
	if (!str) {
  	return new ArrayBuffer(0);
 	}
 	var buffer = new ArrayBuffer(str.length / 2);
 	let dataView = new DataView(buffer)
	let ind = 0;
	for (var i = 0, len = str.length; i < len; i += 2) {
   	let code = parseInt(str.substr(i, 2), 16)
   	dataView.setUint8(ind, code)
   	ind++
	}
	return buffer;
  	}

AES 算法

这是一种对称加密算法,是可以进行加密和解密的,SHA1,hash 这些算法是不可逆的,但是这种算法是可逆的,是在交互过程中进行紧密,再进行解密,可以得到加密内容的。

通常加密的方式有:CTR、CBC、CFB、OFB、ECB

具体参照:https://www.npmjs.com/package/aes-js