# socket类中的属性选择
# 套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。
# 基于文件类型的套接字家族:AF_UNIX
# 基于网络类型的套接字家族:AF_INET
# 此外,我们还可以选择基于各种协议的套接字编程
# 基于TCP协议:SOCK_STREAM
# 基于UDP协议:SOCK_DGRAM
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()
import socket
# 参数表示使用UDP协议
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind((‘192.168.11.124‘,8008))
# 不需要listen直接发送信息
print(‘等待客户端发送数据:‘)
while True:
# recvfrom回返回数据和客户端的地址
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)
# 客户端也需要使用sendto
client.sendto(b‘sb‘,(‘127.0.0.1‘,82))
# 此处可以使用recvfrom拿到返回信息和地址,也可以只是用recv拿到返回信息
# data,addr=client.recvfrom(1024)
# data,_=client.recvfrom(1024)
data=client.recv(1024)
print(data)
# print(addr)
client.close()
原文:https://www.cnblogs.com/zhangchengchao123/p/14683878.html