可接受多个客户端链接的服务端
socket模块补充
1、加入链接循环的套接字客户端
import socket
server = socket.socket()
server.bind(('196.128.11.124',8008))
server.listen(3)
while True:
sock,addr = server.accept()
data = sock.recv(1024)
print("收到来自%s的消息:%s" % (addr,data.decode("utf-8")))
msg = "信息已收到"
sock.send(msg.encode("utf-8"))
sock.close()
server.close()
"""
我们在监听链接处添加了while循环,当一次链接结束后,可以进入下一次循环,实现持续监听
但是现在的服务端存在问题:、
-当客户端正常断开,服务端会受到空信息,并且循环执行打印
-如果客户端非正常断开,服务端会报错
解决方法如下:
-在接收到客户端信息后,判断信息是否为空,如果是,则停止循环
-使用try--except语句捕获异常
-最后为发送消息添加循环,实现单个客户端持续通信
"""
服务端优化
import socket
server = socket.socket()
server.bind(('196.128.11.124',8008))
server.listen(3)
while True:
sock,addr = server.accept()
while True:
try:
data = sock.recv(1024)
if len(data) == 0:
print("%s已断开" % str(addr))
break
print("收到来自%s的消息:%s" % (addr,data.decode("utf-8")))
msg = "信息已收到"
sock.send(msg.encode("utf-8"))
except Exception as e:
print(e)
break
sock.close()
server.close()
可以循环发送信息的客户端
import socket
client = socket.socket()
client.connect(("192.168.11.124",8008))
while True:
msg = input("请输入请求:")
if msg == "q":
break
client.send(msg.encode("utf-8"))
data = client.recv(1024)
print(data.decode("utf-8"))
client.close()
基于UDP协议的套接字编程
服务端
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('192.168.11.124',8008))
print('等待客户端发送数据:')
while True:
data,addr = server.recvfrom()
print("收到来自%s的消息:%s" % (addr,data))
msg = "已收到"
server.sendto(msg.encode("utf-8"))
server.close()
客户端
import socket
client=socket.socket(type=socket.SOCK_DGRAM)
client.sendto(b'sb',('127.0.0.1',82))
data=client.recv(1024)
print(data)
client.close()