服务端
import socket
'''
创建socket 连接
两个参数:
socket——family-->
socket.AF_INET (ipv4)
socket.AF_INET6 (ipv6)
socket.AF_UNIX (unix内部传输)
socket_type-->
socket.SOCKET_STREAM(TCP)
socket.SOCKET_DGRAM(UDP)
'''
#创建socket对象
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定ip和端口
#ip为空表示所有客户端都可连接 ip=127.0.0.1表只有本地连接
sock.bind(('',8000))
#bind 内是一个元组
#设置监听最大数
sock.listen(5)
print("服务器已启动...")
#设置flag 使服务器在输入break时断开连接
flag = 0
while flag == 0:
# 接收信息
# con接收sock对象 add接收ip 端口
con, add = sock.accept()
print('%s 连接成功...' % add[0])
while True:
recvs = con.recv(512)
print('客户端发来消息',recvs.decode('utf-8'))
if recvs.decode('utf-8') == 'break':
print('客户端下线...')
break
sends = input('服务端输入发送信息:')
con.send(sends.encode('utf-8'))
if sends == 'break':
flag = 1
print('服务端要求下线...')
break
#关闭
print('服务端断开')
sock.close()
客户端
import socket
#创建socket对象 所用协议需保持一致
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 连接服务器
sock.connect(('127.0.0.1', 8000))
while True:
# 发送消息
sends = input("客户端输入发送消息:")
sock.send(sends.encode('utf-8'))
#发送消息为break断开连接
if sends == 'break':
print('客户端即将断开连接...')
break
#接收消息
recvs = sock.recv(512)
recvs.decode('utf-8')
print('服务端发回消息',recvs.decode('utf-8'))
if recvs.decode('utf-8') == 'break':
print('服务端断开...')
break
#关闭
sock.close()
结果:
客户端与服务器无限制半双工交互
客户端输入break,断开与服务器连接,且服务器停留在等待连接阶段
服务端输入break,断开与客户端连接,并退出。