基于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. 85、使用TFLearn实现iris数据集的分类

    ''' Created on 2017年5月21日 @author: weizhen ''' #Tensorflow的另外一个高层封装TFLearn(集成在tf.contrib.learn里)对训练T ...

  2. 2017《Java技术》预备作业 计科1502任秀兴

    阅读邹欣老师的博客,谈谈你期望的师生关系是什么样的? 我认为,学生和老师的关系,应该亦师亦友.可以以一种朋友的身份去进行教学,是我们理想中的课堂. 在生活中,老师和我们应该多沟通,成为朋友,在有感情的 ...

  3. npm ERR! cb() never called! npm ERR! This is an error with npm itself. Pleas

    原因是:需要用管理员的身份才能进行 方法:点开始,找到命令提示符,右键,点以管理员的身份运行命令即可

  4. 一个普通函数的冷僻属性(length、caller、arguments、name、[[Scopes]]和[[FunctionLocation]])

    https://blog.csdn.net/qq_17175013/article/details/81915059

  5. jwt认证登录

    配置文件:#服务配置 server: port: 9002 #spring配置 spring: #应用配置 application: name: ynhrm-system #指定服务名 #数据库连接池 ...

  6. java swing 中JTable实现指定单元格为下拉框

    利用自定义的CellEditor实现第四列第二行为下拉框,本列其余行为文本框 利用默认的DefaultCellEditor设置第五列整列为下拉框   package mypackage; import ...

  7. innobackupex2.4选项参考

    该innobackupex2.4选项参考¶ 此页面记录了innobackupex的所有命令行选项. 选项 --apply-log BACKUP-DIR通过应用xtrabackup_logfile位于同 ...

  8. ollvm 使用——“Cannot open /dev/random”错误的解决方法

    找到 \obfuscator-llvm-4.0\lib\Transforms\Obfuscation\CryptoUtils.cpp 这个文件, 新增两个头文件 #include <window ...

  9. 虚拟机linux系统 硬盘/root路径扩容

    调整完后,重新打开虚拟机,使用fdisk -l查看,可以看到我们刚刚扩容的空间已经可以看到,但没有分区,还不能使用./dev/sda已经拥有了扩大的空间. 使用Linux的fdisk分区工具给磁盘/d ...

  10. Centos6.6安装JDK1.8

    首先从官网下载jdk1.8,地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...