7.6 基于UDP的socket

无连接的,不必与对方建立连接,而是直接把数据发送给对方;

适用于一次传输销量数据结构,可靠性不高的应用环境,因为其传输速率快

# 服务端
import socket
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #这里的餐宿已经改成UDP格式了 server.bind(('127.0.0.1',9000)) while 1:
from_client_data = server.recvfrom(1024)
print(f"来自{from_client_data[1]}的消息:{from_client_data[0].decode('utf-8')}")
se = input('>>>').encode('utf-8')
server.sendto(se,from_client_data[1]) # 客户端
import socket client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #这里的餐宿已经改成UDP格式了 while 1:
se = input('>>>').encode('utf-8')
client.sendto(se,('127.0.0.1',9000))
re = client.recvfrom(1024)
print(f"来自{re[1]}的消息:{re[0].decode('utf-8')}")
# 虽然可以实现能够与多个人进行数据交换,但实际上是在发送完数据后关闭了链接,并不是真正意义上的并行运行

7.7 socketserver实现并行运行

服务端

import socketserver

class Myserver(socketserver.BaseRequestHandler): # 定义的类名可以任意取,继承的父类固定格式

    def handle(self):       # 必须要使用handle这个名字
print('listening_in_handle')
while 1: from_client_data = self.request.recv(1024).decode('utf-8')
print(from_client_data) to_client_data = input('>>>').strip()
self.request.send(to_client_data.encode('utf-8')) if __name__ == '__main__': ip_port = ('127.0.0.1',8006)
# socketserver.TCPServer.allow_reuse_address = True # 允许端口重复使用
server = socketserver.ThreadingTCPServer(ip_port,Myserver) # 固定格式
# 对 socketserver.ThreadingTCPServer 类实例化对象,将ip地址,端口号以及自己定义的类名传入,并返回一个对象
server.serve_forever() # 固定格式,对象执行serve_forever方法,开启服务端
print('listening_begin')

客户端

可以设置多个客户端

import socket

client = socket.socket()

client.connect(('127.0.0.1',8006))
while 1:
se = input('>>>').strip()
client.send(se.encode('utf-8'))
re = client.recv(1024).decode('utf-8')
print(f"the massage from server:{re}") client.close()

分析

在整个socketserver这个模块中,最主要的两件事情:
1、一个是循环建立链接的部分,每个客户端的链接都可以连接成功
2、一个通讯循环的部分,就是每个客户端链接成功之后,要循环的和客户端进行通信。 看代码中的:server=socketserver.ThreadingTCPServer(('127.0.0.1',8006),MyServer) 通过print(socketserver.ThreadingTCPServer.mro())查看对象继承的mro顺序,找到它的继承
查找属性的顺序:ThreadingTCPServer->ThreadingMixIn->TCPServer->BaseServer 建立循环连接
**实例化得到server,先找ThreadMinxIn中的__init__方法,发现没有init方法,然后找类ThreadingTCPServer的__init__,在TCPServer中找到,在里面创建了socket对象,进而执行server_bind(相当于bind),server_active(点进去看执行了listen)
**找server下的serve_forever,在BaseServer中找到,进而执行self._handle_request_noblock(),该方法同样是在BaseServer中
**执行self._handle_request_noblock()进而执行request, client_address = self.get_request()(就是TCPServer中的self.socket.accept()),然后执行self.process_request(request, client_address)
**在ThreadingMixIn中找到process_request,开启多线程应对并发,进而执行process_request_thread,执行self.finish_request(request, client_address) 建立通讯:
在BaseServer中找到finish_request,触发我们自己定义的类的实例化,去找__init__方法,其中:
tcp:
self.server即套接字对象
  self.request即一个链接
  self.client_address即客户端地址
udp:
self.request是一个元组(第一个元素是客户端发来的数据,第二部分是服务端的udp套接字对象),如(b'adsf', <socket.socket fd=200, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>)
  self.client_address即客户端地址

Python学习之UDP版socket&SocketServer的更多相关文章

  1. [Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …

    [Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source - [Pyth ...

  2. Python学习之路15☞socket编程

    一 客户端/服务器架构 即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二 os ...

  3. 转-[Python 学习]2.5版yield之学习心得

    在 shhgs 发布了关于< Py 2.5 what’s new 之 yield>之后,原来我不是特别关注 yield 的用法,因为对于2.3中加入的yield相对来说功能简单,它是作为一 ...

  4. Python学习-day7 类 部分socket

    这周还是继续关于类的学习,在面向对象的学习过程中又学习了网络编程,并且提交了编写FTP的作业. 复习一下类的相关概念和定义 类      属性           实例变量:内存中           ...

  5. python学习笔记七 初识socket(进阶篇)

    socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...

  6. python学习之路-9 socket网络编程

    socket基础 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. so ...

  7. Python学习日记(三十) Socket模块使用

    Socket(套接字) 套接字是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信.网 ...

  8. python 学习笔记_2 模拟socket编程 服务端、客户端通信(参考核心编程2代码实现)

    服务器端代码实现: #!/usr/bin/env python#coding=gbk'''接收客户端字符串,在字段串前面打上当前时间,然后返回server端采用 python2 linux下调试运行客 ...

  9. 记一篇Python学习的简易版教程

    廖雪峰的教学博客https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143178 ...

随机推荐

  1. C#制作的屏幕取色器

    1 using System;  2 using System.Collections.Generic;  3 using System.ComponentModel;  4 using System ...

  2. Javascript引擎

    注入了 浏览器对象模型BOM, 文档对象模型DOM

  3. php面向对象相关技术

    step1 一个经典类的设计和实例化 <?php class mycoach { public $_name=''; public $_age=''; public $_expert=array ...

  4. 2017 趋势科技 研发4.26(offer)

    南京趋势科技外企(offer) 笔试 在华科线下笔试的,推荐多参加线下笔试,因为相对难度会低一些,好进一些. 当时笔试的估计只有60几个,然后选择题感觉有的不会,编程简单. 第二天去面试的时候,hr小 ...

  5. 2017 CVTE Windows开发二面 3.8 (offer)

    中午1点左右,广州的号码打过来了,是CVTE的hr,然后问我下午4点半有没有时间,帮我约视频的二面. 当然有时间了啦,然后hr给我邮箱发了个链接,让我4点半登陆进去. 因为1面没问任何网络和操作系统的 ...

  6. [CF1105E] Helping Hiaset

    问题描述 你在某社交网站上面注册了一个新账号,这个账号有\(n(n\leq 10^5)\)次记录.要么就是你更改过一次ID,要么就是一个ID为\(s(|s|\leq 40)\)的朋友访问过你的空间. ...

  7. 算法复习-P NP NPC NP-hard概念

    from http://blog.csdn.net/huang1024rui/article/details/49154507 P.NP.NPC和NP-Hard相关概念的图形和解释 一.相关概念 P: ...

  8. python爬取智联招聘职位信息(多进程)

    测试了下,采用单进程爬取5000条数据大概需要22分钟,速度太慢了点.我们把脚本改进下,采用多进程. 首先获取所有要爬取的URL,在这里不建议使用集合,字典或列表的数据类型来保存这些URL,因为数据量 ...

  9. Python3学习笔记(一): 环境安装

    一.下载Python软件包 进入官网https://www.python.org/downloads/,下载符合你当前OS的版本 我用的是Win7 64位系统,在这里下载的是Windows 64位可执 ...

  10. FLASH和EEPROM的区别

    FLASH和EEPROM的最大区别是FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低 ...