基于udp协议的套接字、socketserver模块

一、UDP协议(数据报协议)

1、何为udp协议

不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。

以太网头 ip头                      udp头                            数据                                           

tcp协议(流式协议)

2、udp协议的特点

(1)传输数据以数据报的形式传送。因为数据以数据包的形式发送,所以没发送一次就会接收一次

from socket import *

server=socket(AF_INET,SOCK_DGRAM)
server.bind(('127.0.0.1',8081)) print(server.recvfrom(1024))
print(server.recvfrom(1024))
print(server.recvfrom(1024)) # (b'hello', ('127.0.0.1', 56816))
# (b'world', ('127.0.0.1', 56816))
# (b'sdfas', ('127.0.0.1', 56816))

服务端

from socket import *

client=socket(AF_INET,SOCK_DGRAM)

client.sendto(b'hello',('127.0.0.1',8888))
client.sendto(b'world',('127.0.0.1',8888))
client.sendto(b'sdfas',('127.0.0.1',8888))

客户端

(2)客户端只管发送数据,不管服务端给不给回复,所以是一种不可靠的协议

二、基于udp协议的套接字

udp是无链接的,先启动哪一端都不会报错

from socket import *

# 1.创建套接字对象
server = socket(AF_INET, SOCK_DGRAM) # 2.绑定服务器IP地址和端口号
server.bind(('127.0.0.1', 8888)) # 3.收发消息
while True:
data, cli_addr = server.recvfrom(1024) # 收到的是数据和客户端地址
print(data)
server.sendto(data.upper(), cli_addr) # 发送消息,根据客户端地址发送消息 server.close()

服务端

from socket import *

# 1.创建套接字对象
server = socket(AF_INET, SOCK_DGRAM) # 2.发收消息
while True:
client.sendto('hello'.encode('utf-8'), ('127.0.0.1', 8888)) # 根据地址发送消息
data, ser_addr = client.recvfrom(1024) # 收消息,获得服务端的消息和地址
print(data)

客户端

三、socketserver模块

1、作用

利用socketserver模块可以实现并发

2、基于TCP协议的并发

自定义类中:

  1. self.request  即一个套接字对象
  2. self.client_address  即客户端地址
# 服务端
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
while True: # 通信循环
try:
data = self.request.recv(1024)
print(data.decode('utf-8'))
self.request.send(data.upper())
except ConnectionResetError:
break if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1', 8888), MyTCPHandler)
server.serve_forever() # 链接循环
# 客户端
from socket import * cli_socket = socket(AF_INET, SOCK_STREAM) cli_socket.connect(('127.0.0.1', 8888)) while True:
cli_socket.send('hello'.encode('utf-8'))
data = cli_socket.recv(1024)
print(data.decode('utf-8')) cli_socket.close()

3、基于UDP协议的并发

自定义类中:

  1. 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)>)
  2. self.client_address即客户端地址
# 服务端
import socketserver class MyUDPHandler(socketserver.BaseRequestHandler):
def handle(self):
while True: # 通信循环
print(self.request) # (b'hello', <socket.socket fd=216, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8888)>)
data, sock = self.request
sock.sendto(data.upper(), self.client_address) if __name__ == '__main__':
server = socketserver.ThreadingUDPServer(('127.0.0.1', 8888), MyUDPHandler)
server.serve_forever() # 链接循环
#客户端
from socket import * cli_socket = socket(AF_INET, SOCK_STREAM) while True:
cli_socket.sendto('hello'.encode('utf-8'), ('127.0.0.1', 8888))
data, server_addr = cli_socket.recvfrom(1024)
print(data.decode('utf-8')) cli_socket.close()

网络编程(四)——基于udp协议的套接字socket、socketserver模块的使用的更多相关文章

  1. 网络编程(四)--基于udp协议的套接字、socketserver模块

    一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. 以太网头 ip头                  ...

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

    目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...

  3. python 之 网络编程(基于UDP协议的套接字通信)

    8.5 基于UDP协议的套接字通信 UDP协议:数据报协议 特点:无连接,一发对应一收,先启动哪一端都不会报错 优点:发送效率高,但有效传输的数据量最多为500bytes 缺点:不可靠:发送数据,无需 ...

  4. python 之 网络编程(基于TCP协议的套接字通信操作)

    第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...

  5. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现

    一.客户端/服务器架构(C/S架构)                                                即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...

  6. 网络编程(基于udp协议的套接字/socketserver模块/进程简介)

    一.基于UDP协议的套接字 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就 ...

  7. 网络编程[第二篇]基于udp协议的套接字编程

    udp协议下的套接字编程 一.udp是无链接的    不可靠的 而上篇的tcp协议是可靠的,会有反馈信息来确认信息交换的完成与否 基于udp协议写成的服务端与客户端,各司其职,不管对方是否接收到信息, ...

  8. 网络编程基础:粘包现象、基于UDP协议的套接字

    粘包现象: 如上篇博客中最后的示例,客户端有个 phone.recv(2014) , 当服务端发送给客户端的数据大于1024个字节时, 多于1024的数据就会残留在管道中,下次客户端再给服务端发命令时 ...

  9. 网络编程(二)--TCP协议、基于tcp协议的套接字socket

    一.TCP协议(Transmission Control Protocol 传输控制协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会 ...

随机推荐

  1. Vue学习之路之登录注册实例代码

    Vue学习之路之登录注册实例代码:https://www.jb51.net/article/118003.htm vue项目中路由验证和相应拦截的使用:https://blog.csdn.net/wa ...

  2. [轉]Reverse a singly linked list

    Reverse a singly linked list  http://angelonotes.blogspot.tw/2011/08/reverse-singly-linked-list.html ...

  3. ReentrantReadWriteLock的相关使用

    ReentrantLock具有完全互斥排他的效果,同一时间只有一个线程执行ReentrantLock.lock()方法后面的任务,这样虽然能够保证线程安全性,但是效率是比较低的 ReentrantRe ...

  4. java漏洞历史

    内容来自以前收集的思维导图,作者不明. 1.JDK漏洞 1.1.CVE-2012-4681 https://www.freebuf.com/vuls/5485.html msf: exploit/mu ...

  5. IIS 承载的服务失败

    如果 IIS 承载的某个服务失败,则可能会看到以下症状之一: 当浏览到 .svc 文件时,不能识别该文件,浏览器显示空白页,或显示文件的文本而不是服务的帮助页,如下面的示例所示.     <%@ ...

  6. 导入C文件Xcode出现Could not build module 'Foundation'错误

    #ifdef __OBJC__ #import <Foundation/Foundation.h> #import "UIImageView+WebCache.h" # ...

  7. Spring Boot中普通类获取Spring容器中的Bean

    我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,自己动手n ...

  8. tar - tar 档案文件管理程序的 GNU 版本。

    总览 tar [ - ] A --catenate --concatenate | c --create | d --diff --compare | r --append | t --list | ...

  9. Linux设置chrome缓存至内存,及开关机同步

    默认chrome缓存位置在~/.cache/google-chrome中,磁盘io很多.为减少磁盘io,保护磁盘同时加快chrome速度,可设置缓存使用内存盘,缺点是重启后缓存丢失,所以这里可以使用脚 ...

  10. Codeforces 1155F 状压DP

    题意:给你一张图,问最少保留多少条边,使得这张图是边双联通分量. 思路:如果一个点集中的点已经是边双联通分量,那么从这个点集中的点x出发,经过若干个不是点集中的点,回到点集中的点y(x可能等于y),那 ...