服务器
from socket import *
server = socket(AF_INET,SOCK_STREAM)#创建服务器对象,套接字家族,面向网络,选择tcp协议,udp(DGRAM)
HOST = "127.0.0.1"#设置服务器ip
PORT = 8888#设置端口
BASE_SIZE = 1024#设置接收文件上限
server.bind((HOST,PORT))#绑定端口,ip
server.listen(5)#监听
while True:
conn,addr = server.accept()#接收客户端请求,完成了三次挥手,获取客户端对象和地址
while True:
try:#监测客户端突然退出异常
msg = conn.recv(BASE_SIZE)#接收信息
if not msg:#linux系统客户端退出不会报错,一直发空包,故实现跨平台
conn.close()
break
print(msg.decode("utf-8"))#打印接收信息,以什么编码存,以什么编码读
conn.send(msg.upper())#给客户端回信息
except ConnectionResetError:#客户端突然退出时,关闭客户端对象,重新进入阻塞接收客户请求
conn.close()
break#不加的话,内层循环msg = conn.recv会报错,因为套接字已关闭
server.close()
客户端
from socket import *
client = socket(AF_INET,SOCK_STREAM)#创建客户端对象,套接字家族,选择面向网络,选择tcp协议
HOST = "127.0.0.1"
PORT = 8888
BASE_SIZE = 1024
client.connect((HOST,PORT))#链接服务器,向服务器发请求,完成三次握手
while True:
msg = input(">>>:").strip().encode("utf-8")
client.send(msg)#发送信息,只能发送bytes类型
res = client.recv(BASE_SIZE)#接收服务器信息
print(res.decode("utf-8"))
client.close()
udp循环输入
服务器
from socket import *
server = socket(AF_INET,SOCK_DGRAM)#建立服务器,选择套接字家族和udp协议
HOST = "127.0.0.1"
PORT = 8888
BASE_SIZE = 1024
server.bind((HOST,PORT))#绑定端口,ip
while True:
msg,addr = server.recvfrom(BASE_SIZE)#直接接收,与tcp不同,tcp接收的是信息,udp接收的是信息和客户端地址
print(msg.decode("utf-8"))
server.sendto(msg.upper(),addr)#直接发送,需要加客户端地址
server.close()
客户端
from socket import *
client = socket(AF_INET, SOCK_DGRAM)
HOST = "127.0.0.1"
PORT = 8888
BASE_SIZE = 1024
while True:
msg = input(">>:").strip().encode("utf-8")
client.sendto(msg,(HOST,PORT))#发送时需加上服务器地址
res,addr = client.recvfrom(BASE_SIZE)#接收服务器信息和服务器地址
print(res.decode("utf-8"))
client.close()
tcp #好人协议,可靠性高,效率低
udp#可靠性低,不管对方收不收到,不管地址存不存在,效率高