AP计算机科学A(APcomputer science A)复习备考攻略视频教程
43755 人在学
离线可使用,功能更完善,安全性更高
# 基于tcp
# server端
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 5002)) # 5002是端口
# 打开监听模式
sk.listen()
# 建立连接,conn是连接,addr是连接的地址
conn, addr = sk.accept()
# 发送信息
conn.send(b'Hello, I am server')
# 最多接收1024字节
msg = conn.recv(1024)
print(msg)
print(addr)
conn.close() # 关闭连接
sk.close() # 关闭整个服务
#########################################
# client端
import socket
sk = socket.socket()
# 建立连接
sk.connect(('127.0.0.1', 5002))
# 接收信息
msg = sk.recv(1024)
print(msg)
# 发送信息
sk.send(b'Hello, I am client')
sk.close() # 关闭连接
需要用到.recvfrom
(可接收信息和IP)和.sendto
(发送信息需附带IP地址)。
# server端
# 一服务端对多客户端通信
# 服务端不用主动退出,由客户端收发消息进行退出
import socket
sk = socket.socket(type = socket.SOCK_DGRAM) # 默认参数是tcp,此参数为udp
sk.bind(('127.0.0.1', 5002))
while True:
# 不能先发送,因为不知道接收端地址信息,只能等待接收,并且必须接收到客户端的地址
msg_r, addr = sk.recvfrom(1024)
print(addr)
print(msg_r.decode('UTF-8'))
msg_s = input(">>>")
sk.sendto(msg_s.encode('UTF-8'), addr)
################################################
# client端
import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
# 传入服务端地址
server = ('127.0.0.1', 5002)
while True:
msg_s = input(">>>")
sk.sendto(msg_s.encode('UTF-8'), server)
if msg_s == "拜拜": break
# 接收服务端的信息,由于知道服务端地址所以不需要recvfrom
msg_r = sk.recv(1024)
if msg_r.decode('UTF-8') == "拜拜": break
print(msg_r.decode('UTF-8'))
解决办法:设置边界自定义协议:发送端统计长度,每次将长度固定为n字节发送
# server端同时发送两条消息
msg_s1 = input(">>>")
msg_s2 =input(">>>")
lens = str(len(msg_s1)) # 统计msg_s1的长度,ziff传入数据应为str,所以要转成str
len = lens.zfill(4) # 将收集到的长度大小统一扩至4字节,例如msg_s1长度为6字节,则为0006
conn.send(len.encode('UTF-8')) # 将长度信息发送出去
conn.send(msg_s1.encode('UTF-8'))
conn.send(msg_s2.encode('UTF-8'))
# clien端接收
len = int(sk.recv(4).decode('UTF-8')) # 接收长度信息
msg_r1 = sk.recv(len)
msg_r2 = sk.recv(1024)
print(msg_r2.decode('UTF-8'))
print(msg_r1.decode('UTF-8'))
###############################################################
# struct方法
# server端同时发送两条消息
msg_s1 = input(">>>")
msg_s2 =input(">>>")
lens_byte = struct.pack('i', len(msg_s1)) # 可以将数据转成固定4字节
conn.send(lens_byte)
conn.send(msg_s1.encode('UTF-8'))
conn.send(msg_s2.encode('UTF-8'))
# clien端接收
lens_byte = sk.recv(4)
len = struct.unpack('i', lens_byte)[0] # unpack返回值为元组,第一位即为长度信息
msg_r1 = sk.recv(len)
msg_r2 = sk.recv(1024)
print(msg_r1.decode('UTF-8'))
print(msg_r2.decode('UTF-8'))
在您开始之前,在你的计算机将需要Python,但您可能不需要下载它。首先检查(在同级目录下在命令行窗口输入python)有没有安装Python。如果你看到了一个Python解释器的响应,那么就能在它的显示窗口中得到一个版本号。通常的版本都可以做到Python的向前兼容。