网络编程基础补充

可接受多个客户端链接的服务端

socket模块补充

# socket类中的属性选择
# 套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。 
	# 基于文件类型的套接字家族:AF_UNIX
    # 基于网络类型的套接字家族:AF_INET
# 此外,我们还可以选择基于各种协议的套接字编程
	# 基于TCP协议:SOCK_STREAM
    # 基于UDP协议:SOCK_DGRAM

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

# 参数表示使用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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值