python-基于UDP通信的套接字,socketserver模块的使用
一、基于UDP协议通信的套接字
udp是没有链接的,所以先启动哪一端都不会报错
import socket server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server.bind(('127.0.0.1',8082)) while True: data,client_addr=server.recvfrom(1024) print(data) server.sendto(data.upper(),client_addr) server.close()
import socket client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) while True: msg=input('>>: ').strip() client.sendto(msg.encode('utf-8'),('127.0.0.1',8082)) data,server_addr=client.recvfrom(1024) print(data)
由于udp无连接,所以可以同时多个客户端去跟服务端通信(实现简单的并发,并不可靠)
import socket client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) while True: msg=input('>>: ').strip() client.sendto(msg.encode('utf-8'),('127.0.0.1',8082)) data,server_addr=client.recvfrom(1024) print(data)
udp不会出现粘包现象,因为每个中就已经有了报头,这样对于接收端来说,容易区分处理。
udp的recvfrom是阻塞的,一个recvfrom(x)必须对唯一一个sendinto(y),收完了x个字节的数据就算完成,若是y>x数据就丢失,这意味着udp根本不会粘包,但是会丢数据,不可靠
二、socketserver模块
socketserver模块简化了编写网络服务程序的任务,是python标准库中很多服务器框架的基础。
socketserver中包含了两种类,一种为服务类(server class),一种为请求处理类(request handle class),前者主要做的是建立链接的过程,后者注重用户数据的处理
要实现一项服务,还必须派生一个handler class请求处理类,并重写父类的handle()方法。handle方法就是用来专门是处理请求的。该模块是通过服务类和请求处理类组合来处理请求的。SocketServer模块提供的请求处理类有BaseRequestHandler。
1.基于tcp协议通信
# 服务端必须满足至少三点: # 1. 绑定一个固定的ip和port # 2. 一直对外提供服务,稳定运行 # 3. 能够支持并发 import socketserver # 自定义类用来处理通信循环 class MyTCPhanler(socketserver.BaseRequestHandler): def handle(self): while True: try: data = self.request.recv(1024) if len(data) == 0: break # 针对linux系统 print('-->收到客户端的消息: ', data) self.request.send(data.upper()) except ConnectionResetError: break self.request.close() if __name__ == '__main__': server=socketserver.ThreadingTCPServer(('127.0.0.1',8081),MyTCPhanler) server.serve_forever() # 链接循环
from socket import * client = socket(AF_INET, SOCK_STREAM) client.connect(('127.0.0.1', 8081)) # 通信循环 while True: # msg=input('>>: ').strip() #msg='' # if len(msg) == 0:continue # client.send(msg.encode('utf-8')) #client.send(b'') client.send('hello'.encode('utf-8')) #client.send(b'') # print('has send') data=client.recv(1024) # print('has recv') print(data) client.close()
from socket import * client = socket(AF_INET, SOCK_STREAM) client.connect(('127.0.0.1', 8081)) # 通信循环 while True: # msg=input('>>: ').strip() #msg='' # if len(msg) == 0:continue # client.send(msg.encode('utf-8')) #client.send(b'') client.send('hello'.encode('utf-8')) #client.send(b'') # print('has send') data=client.recv(1024) # print('has recv') print(data) client.close()
2.基于udp协议通信
import socketserver class MyUdphandler(socketserver.BaseRequestHandler): def handle(self): data,sock=self.request sock.sendto(data.upper(),self.client_address) if __name__ == '__main__': server=socketserver.ThreadingUDPServer(('127.0.0.1',8081),MyUdphandler) server.serve_forever()
from socket import * client=socket(AF_INET,SOCK_DGRAM) while True: client.sendto(b'hello',('127.0.0.1',8081)) data,server_addr=client.recvfrom(1024) print(data)
from socket import * client=socket(AF_INET,SOCK_DGRAM) while True: client.sendto(b'hello',('127.0.0.1',8081)) data,server_addr=client.recvfrom(1024) print(data)
焚膏油以继晷,恒兀兀以穷年。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
3.JUC线程高级-同步容器 ConcurrentHashMap
Java5.0 在java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能。 ConcurrentHashMap 同步容器类是Java5 增加的一个线程安全的哈希表。对于多线程的操作,介于HashMap与Hashtable之间。内部采用锁分段机制代替Hashtable 的独占锁。进而提高性能。 此包还提供了设计用于多线程上下文中的Collection 实现: ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList 和 CopyOnWriteArraySet。 当期望许多线程访问一个给定 collection 时,ConcurrentHashMap 通常优于同步的 HashMap,ConcurrentSkipListMap 通常优于同步的 TreeMap。 当期望的读数和遍历远远大于列表的更新数时,CopyOnWriteArrayList 优与同步的 ArrayList。 1. Hashtable 之所以效率低下的原因: 内部使用独占锁机制,特别是遇...
- 下一篇
4.JUC线程高级-CountDownLatch 闭锁
Java5.0 在java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能。 1. CountDownLatch 闭锁 CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 闭锁可以延迟线程的进度直到其达到终止状态 闭锁可以用来确保某些活动直到其他活动都完成之后才继续执行: a) 确保某个计算在其需要的所有资源都被初始化之后才继续执行; b) 确保某个服务在其依赖的所有其他服务都已经启动之后才启动; c) 等待直到某个操作所有参与制都准备就绪在继续执行。 比如:统计下多个线程执行完毕之后的总耗时: package com.pyy.juc; import java.util.concurrent.CountDownLatch; public class TestCountDownLatch { public static void main(String[] args) { final CountDownLatch latch = new CountDownLatch(5); LatchDemo...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题