模拟服务器端和客户端通信
# 服务端 # encoding=utf-8 import socket # socket模块 HOST = ‘127.0.0.1‘ PORT = 8085 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 定义socket类型,网络通信,TCP s.bind((HOST, PORT)) # 套接字绑定的IP与端口 s.listen(5) # 开始TCP监听,listen中的参数表示可以多少客户端来进行连接 while 1: conn, addr = s.accept() # 接受TCP连接,并返回新的套接字与IP地址 print(‘客户端地址:‘, addr) # 输出客户端的IP地址 while 1: try: conn.settimeout(10) # 设置多长时间内没有收到数据,抛出异常 data = conn.recv(1024) # 把接收的数据实例化 print(data) conn.sendall(‘服务返回结果‘.encode("utf-8")+data.upper()) except socket.timeout: print(‘等客户端半天了,连接后都不发数据‘) conn.close() # 关闭连接 break except Exception: conn.close() # 关闭连接 break
# 客户端 #encoding=utf-8 import socket HOST=‘127.0.0.1‘ PORT=8085 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 定义socket类型,网络通信,TCP s.connect((HOST,PORT)) # 要连接的IP与端口 count=3 while count>0: cmd=input("向服务器发送命令:") s.sendall(cmd.encode("utf-8")) # 把命令发送给对端 data=s.recv(1024) # 把接收服务器返回的数据 print(data.decode("utf-8")) # 输出变量 count -= 1 s.close() #关闭连接
执行结果:
服务端
客户端
备注:
send 和 sendall 区别
sendall:尝试发送string的所有数据, 成功则返回None, 失败则抛出异常。
send:send()的返回值是发送的字节数量, 这个数量值可能小于要发送的string的字节数,也就是说可能无法发送string中所有的数据。如果有错误,则会抛出异常。
原文:https://www.cnblogs.com/su-sir/p/12686143.html