网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

基于UDP协议的套接字编程

UDP套接字简单示例

服务端

import scoket

server = socket.socket(socket.AF_INET, scoket.SOCK_DGRAM)  # 数据报协议-->UDP

server.bind(('127.0.0.1', 8080))

server.listen(5)

while True:
    data, client_addr = server.recvfrom(1024)
    print(data, client_addr)
    
    server.sendto(data.upper(), client_addr)

客户端

import socket

client = socket.socket(socket.AF_INET, scoket.SOCK_DGRAM)  # 数据报协议-->UDP

while True:
    
    msg = input('请输入mag>>>')
    
    client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
    
    data, server_addr = client.recvfrom(1024)
    
    print(data.decode('utf-8'), server_addr)
  • UDP是无链接的,先启动哪一端都不会报错
  • UDP协议是数据报协议,发空的时候也会自带报头,因此客户端输入空,服务端也能收到

  • UPD协议一般不用于传输大数据。
  • UDP套接字虽然没有粘包问题,但是不能替代TCP套接字,因为UPD协议有一个缺陷:如果数据发送的途中,数据丢失,则数据就丢失了,而TCP协议则不会有这种缺陷,因此一般UPD套接字用户无关紧要的数据发送,例如qq聊天。

基于socketserver实现并发的socket

基于TCP协议

基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环

socketserver模块中分两大类:server类(解决链接问题)和request类(解决通信问题)

server类

o_server%e7%b1%bb.png

request类

o_request%e7%b1%bb.png

继承关系

o_%e7%bb%a7%e6%89%bf%e5%85%b3%e7%b3%bb1.png

o_%e7%bb%a7%e6%89%bf%e5%85%b3%e7%b3%bb2.png

o_%e7%bb%a7%e6%89%bf%e5%85%b3%e7%b3%bb3.png

服务端

import socketserver


class MyHandler(socketserver.BaseRequestHandler):
    def handle(self):
        # 通信循环
        while True:
            data = self.request.recv(1024)
            if len(data) == 0: 
                break
            self.request.send(data.upper())


if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyHandler, bind_and_activate=True)

    server.serve_forever()  # 代表连接循环
    # 循环建立连接,每建立一个连接就会启动一个线程(服务员)+调用Myhanlder类产生一个对象,调用该对象下的handle方法,专门与刚刚建立好的连接做通信循环

客户端1

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080))  # 指定服务端ip和端口

while True:
    msg=input('>>: ').strip()
    if len(msg) == 0: 
        continue
    client.send(msg.encode('utf-8'))
    data = client.recv(1024)
    print(data)

phone.close()

客户端2

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080))  # 指定服务端ip和端口

while True:
    msg=input('>>: ').strip()
    if len(msg) == 0: 
        continue
    client.send(msg.encode('utf-8'))
    data = client.recv(1024)
    print(data)

phone.close()

基于UDP协议

服务端

import socketserver


class MyHandler(socketserver.BaseRequestHandler):
    def handle(self):
        # 通信循环
        print(self.client_address)
        print(self.request)

        data = self.request[0]
        print('客户消息', data)
        self.request[1].sendto(data.upper(), self.client_address)


if __name__ == '__main__':
    s = socketserver.ThreadingUDPServer(('127.0.0.1', 8080), MyHandler)
    s.serve_forever()

客户端1

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》udp

while True:
    # msg=input('>>: ').strip() #msg=''
    msg = 'client1111'
    client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
    data, server_addr = client.recvfrom(1024)
    print(data)

client.close()

客户端2

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》udp

while True:
    # msg=input('>>: ').strip() #msg=''
    msg = 'client2222'
    client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
    data, server_addr = client.recvfrom(1024)
    print(data)

client.close()

转载于:https://www.cnblogs.com/Hades123/p/11099748.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值