基于UDP的交互的实例
1.实现简单的客户端、服务端聊天交互
问题是:客户端不能单独一直发消息回复、、
服务端:
import socket
server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8080)) while True:
client_data,client_addr=server.recvfrom(1024)
print(client_data.decode(),client_addr)
while True:
msg=input('回复给Client%s的消息>>>:'%client_addr[0])
# server.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
# 特别注意:这里回复消息是一定要写client_addr不能固定
#是针对上面recvfrom收到的客户端接口定向发送的,这个接口不能写死,每个交互的客户端接口都是不一样的
server.sendto(msg.encode('utf-8'),client_addr)
print(client_addr) 客户端:
import socket
client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) while True:
msg=input('>>>:')
client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
while True:
server_data,server_addr=client.recvfrom(1024)
print(server_data.decode())
2.socketserver实现并发通信
socketserver-TCP应用实例:
并发:看起来同时运行,连接数少的时候并没有感觉,连接数多的时候,就会有延迟
原理就是:
将通信循环放到类里面,通过实例化对象将数据+方法整合到一起
s=socketserver.ThreadingTCPServer((服务端的IP和端口),类名,bind_and_activate=True就是bind和listen)
s:相当与是一个负责连接的套接字对象;
self.request
s=socketserver.ThreadingTCPServer(('127.0.0.1',8080),Myhandler,bind_and_activate=True)
ThreadingTCPServer:线程,没成功建立一个连接,就会启动一个线程(服务员)
负责专门与建立好的连接做通信循环(调用Myhandler类下面的handle函数)
如何配置:
服务端配置:
import socketserver class Myhandler(socketserver.BaseRequestHandler):
def handle(self):
while True: #循环的去通信
try:
data=self.request.recv(1024) #收消息
if len(data) == 0:break
self.request.send(data.upper()) #发消息 #self.request=conn
except ConnectionResetError:
break
self.request.close() if __name__ == '__main__':
s=socketserver.ThreadingTCPServer(('127.0.0.1',8080),Myhandler,bind_and_activate=True)
s.serve_forever() #循环建立连接 -------------------------------------------------------------------------------- 客户端配置无需进行改动。。
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('127.0.0.1',8080))
while True:
msg=input('输入发送的内容:')
if len(msg) == 0:continue
phone.send(msg.encode('utf-8'))
data=phone.recv(1024)
print(data.decode('utf-8')) phone.close()
socketserver-UDP应用实例:
服务端配置:
import socketserver class Myhandler(socketserver.BaseRequestHandler):
def handle(self):
print(self.client_address) #('127.0.0.1', 49228) 元组格式
print(self.request) #一个元祖:1:数据 2:套接字对象 #(b'\xe4\xbd\xa0\xe5\xa5\xbd', <socket.socket fd=528...>)
# self.request:相当与收到了一个报头(数据部分,套接字对象) data = self.request[0] #元组的第一位就是数据,第二位是套接字对象 print('客户消息:',data.decode('utf-8'))
self.request[1].sendto(data.upper(),self.client_address) if __name__ == '__main__':
s = socketserver.ThreadingUDPServer(('127.0.0.1', 8080), Myhandler, bind_and_activate=True)
s.serve_forever() ---------------------------------------------------------------------------
客户端配置:
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',8080))
data,server_addr=client.recvfrom(1024)
print(data.decode('utf-8')) client.close()
知识点四:
1.串行:一个任务完完整整的运行完毕后,才能运行下一个任务
2.并发:看起来多个任务是同时运行的即可,单核也可以实现并发
3.并行:真正意义上多个任务的同时运行,只有多核才实现并行
4.cpu功能:cup是用来做计算,cpu是无法执行IO操作的,一旦遇到io操作,应该让cpu去执行别的操作
5.多道技术:
1.空间上的复用=》多个进程公用一个内存,如内存中同时有多道程序
2.时间上的复用=》多个进程复用同一个cpu的时间,复用一个cpu的时间片
cpu遇到IO切换:可以提升效率
强调:遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,这样
才能保证下次切换回来时,能基于上次切走的位置继续运行
基于UDP的交互的实例的更多相关文章
- Java实例练习——基于UDP协议的多客户端通信
昨天学习了UDP协议通信,然后就想着做一个基于UDP的多客户端通信(一对多),但是半天没做出来,今天早上在参考了很多代码以后,修改了自己的代码,然后运行成功,在这里分享以下代码,也说一下自己的认识误区 ...
- [转帖]技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解
技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解 http://www.52im.net/thread-1309-1-1.html 本文来自腾讯资深研发工程师罗成的技术分享, ...
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- 基于UDP协议的网络编程
UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象. Java使用DatagramSock ...
- python 全栈开发,Day34(基于UDP协议的socket)
昨日内容回顾 网络的基础概念arp协议 :通过ip地址找到mac地址五层模型 : 应用层 传输层 网络层 数据链路层 物理层tcp协议 : 可靠的 面向连接 全双工 三次握手 四次挥手udp协议 : ...
- 基于Udp的五子棋对战游戏
引言 本文主要讲述在局域网内,使用c#基于Udp协议编写一个对战的五子棋游戏.主要从Udp的使用.游戏的绘制.对战的逻辑这三个部分来讲解. 开发环境:vs2013,.Net4.0,在文章的末尾提供源代 ...
- 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现
一.客户端/服务器架构(C/S架构) 即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...
- TCPIP协议编程:基于UDP协议的局域网聊天工具的研发
任务目标 聊天器采用客户端/服务器(C/S)模式: 客户端利用UDP与服务器相连,客户端与客户端之间通过UDP相互通信: 服务器端具有服务器端口设置维护客户端个人信息,记录客户端状态,分配账号等: 客 ...
- 基于UDP高性能传输协议UDT doc翻译(一)
原文转自:http://hi.baidu.com/doodlezone/item/74a203155efe26dbbf9042dd UDT文档阅读理解 一. 概述 ...
随机推荐
- 解决Mysql导入大数据出现gone away的问题
在用Mysql Yog或者PHPMyadmin等工具导入数据量大的sql文件时,会提示“gone away”,那么如何处理这个问题尼? 在Mysql对应的配置文件中my.ini文件中加入以下配置: # ...
- Python3+Selenium3+webdriver学习笔记13(js操作应用:弹出框无效如何处理)
#!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记13(js操作应用:弹出框无效如何处理)'''from sel ...
- 在Linux系统里安装Virtual Box的详细步骤
今天我试图在Linux 服务器上安装Kyma时,遇到如下错误消息: E1009 23:51:37.685891 358 start.go:174] Error starting host: Error ...
- 分享一些关于Lucene的心得
Lucene的概述 Lucene是一个全文搜索框架,而不是应用产品.因此它并不像http://www.baidu.com/ 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实 ...
- php 基本连接mysql数据库和查询数据
连接数据库,有三种方法 1. 常规方式: $con=mysql_connect($dbhostip,$username,$userpassword) or die("Unable to co ...
- centos7-vsftpd文件服务器
FTP简介: 文件传输协议(File Transfer Protocol,FTP),基于该协议FTP客户端与服务端可以实现共享文件.上传文件.下载文件. FTP 基于TCP协议生成一个虚拟的连接,主要 ...
- CornerStone使用跳坑总结
Cornerstone是专门为Mac用户设计的Subversion(SVN)的控制,使版本控制更加透明.cornerstone根Xcode相比,能够更好的忽略文件,所以除了项目经理第一次初始化项目的时 ...
- 代码块(block)的使用
Objective-C语法之代码块(block)的使用 代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值. 脱 ...
- ReactiveCocoa概念解释篇
1.ReactiveCocoa简介 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Coco ...
- Boo who-freecodecamp算法题目
Boo who 1.要求 检查一个值是否是基本布尔类型,并返回 true 或 false. 基本布尔类型即 true 和 false 2.思路 利用switch语句判断输入的数据是true/false ...