客户端向服务端获取数据实例:
# coding: utf-8 import time import socket from struct import * def connect(host, port): # create socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) s.settimeout(5) s.connect((host, port)) return s def send(host, byte): s = connect(host, 7777) # 7777 端口号 s.sendall(byte) return s def recv(host, byte): s = send(host, byte) data = s.recv(264) return data def unpackdata(host, byte): data = recv(host, byte) tup = unpack('ii256s', data) return tup if __name__ == '__main__': host = '172.30.100.40' param = b'uname -a' sendparam = param + b'\0' * (256 - len(param)) byte = pack('ii256s', 0, 0, sendparam) # 第二个参数是用例编号 data = unpackdata(host, byte) print('packdata = ', data)
服务器返回数据:
packdata = (0, 0, b'Linux localhos****(此处删除了部分字符) CST 2022 aarch64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002022-05-07 15:38:19.686194\x00\x00\x00\x00\x00\x00')
以下是课件内容
服务端代码:
# coding:utf-8
# === TCP 服务端程序 server.py ===
from socket import *
# 主机地址为127.0.0.1,表示绑定主机所有网络接口ip地址
# 等待客户端来连接
IP = '127.0.0.1'
PORT = 50000
#定义一次从socket缓冲区最多读入512个字节数据
BUFLEN = 512
# 实例化一个socket对象
# 参数AF_INET:表示该socket网络层使用IP协议
# 参数SOCK_STREAM:表示该socket传输层使用tcp协议
listenSocket = socket(AF_INET, SOCK_STREAM)
# socket绑定地址和端口
listenSocket.bind((IP, PORT))
# 使socket处于监听状态,等待客户端的连接请求
# 参数5表示 最多接受多少个等待连接的客户端
listenSocket.listen(5)
print(f'服务端启动成功,在{PORT}端口等待客户端连接...')
dataSocket, addr = listenSocket.accept()
print('接受一个客户端连接: ',addr)
while True:
# 尝试读取对方发送的消息
# BUFLEN 指定指定从接收缓冲里最多读取多少字节
recved = dataSocket.recv(BUFLEN)
# 如果返回空bytes,表示对方关闭了连接
# 退出循环,结束消息收发
if not recved:
break
# 读取的字节数据是bytes类型,需要解码为字符串
info = recved.decode() # 编码解码需要根据实际情况,如果是音频视频,需要另外处理
print(f'收到对方信息: {info}')
# 发送的数据类型必须是bytes,所以要编码
dataSocket.send(f'服务端接收到了信息{info}'.encode())
dataSocket.close()
listenSocket.close()
客户端代码:
# --- coding:utf-8---- # === TCP 服务端程序 client.py === from socket import * IP = '127.0.0.1' SERVER_PORT = 50000 BUFLEN = 512 dataSocket = socket(AF_INET, SOCK_STREAM) dataSocket.connect((IP, SERVER_PORT)) while True: # 从终端读入用户输入的字符串 toSend = input('>>> ') if toSend == 'exit': break dataSocket.send(toSend.encode()) # 等待接收服务段的消息 recved = dataSocket.recv(BUFLEN) if not recved: break print(recved.decode()) dataSocket.close()