首页 > 其他 > 详细

网络编程基础补充

时间:2021-04-21 16:15:43      阅读:19      评论:0      收藏:0      [点我收藏+]

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

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()

网络编程基础补充

原文:https://www.cnblogs.com/zhangchengchao123/p/14683878.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!