1 Python TCP客户端的Socket通信
1.1 连接服务器
self.serverSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.serverHost = '10.118.21.61'
self.serverPort = 20173
self.serverSock.connect((self.serverHost, self.serverPort))
1.2 发送byte数据
1.2.1 struct构建byte数据:
values = (len(self.action), self.action, self.dataType, len(self.fileName), self.fileName, len(self.source), self.source) s = struct.Struct('<B' + str(len(self.action)) + 'sBB' + str(len(self.fileName)) + 'sI' + str(len(self.source)) + 's') packed_data = s.pack(*values)
如果format为sI时,I代表的int十六进制,可能会在前面多出00,原因??
解决办法:需在format最前面加上'<'或者'>'。
1.2.2 send函数
self.serverSock.send(reqBytes)//发送字节串
self.serverSock.shutdown(socket.SHUT_WR)//关闭输出流,防止服务器读取时,无法读取到结束符
1.3 recv_into函数
1.3.1 接受bytearray数据
buffer = bytearray(100) self.serverSock.recv_into(buffer) print binascii.hexlify(buffer) print buffer[0] & 0xff print buffer[1] & 0xff print buffer[2] & 0xff i = self.byte4ToInt(buffer, 3)
print i
执行结果:
0101000d000000
1
1
0
13
1.3.2 byte4ToInt函数
def byte4ToInt(self,bytearray, start): i = (bytearray[start] & 0xff) \ | (bytearray[start+1] & 0xff) \ | (bytearray[start+2] & 0xff) \ | (bytearray[start+3] & 0xff) return iint类型为32bit,即4byte。此处才用从低到高的小字节序(little-debian)的顺序存储int数据。