python socket udp并发_Python进阶----UDP协议使用socket通信,socketserver模块实现并发

Python进阶----UDP协议使用socket通信,socketserver模块实现并发

一丶基于UDP协议的socket

实现UDP协议传输数据

d9f45f34977440a047b22c047ee4164d.png

代码如下:👇

### 客户端

# -*-coding:utf-8-*-

# Author:Ds

import socket

# 实例化UDP协议的socket对象 ,配置参数, socket.SOCK_DGRAM(数据报)

udp_cli=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

while 1:

# 1. 向客户端发送数据

to_ser_msg=input('请输入内容:>>>').strip()

# sendto 包含 字节数据和服务端的ip和端口 两部分内容

udp_cli.sendto(to_ser_msg.encode('utf-8'),('127.0.0.1',9999))

# 2. recvfrom 接收服务端返回的数据

from_ser_msg=udp_cli.recvfrom(1024)

print(f'来自{from_ser_msg[1]}的信息:{from_ser_msg[0].decode("utf-8")}')

### 服务端

# -*-coding:utf-8-*-

# Author:Ds

import socket

# 实例化UDP协议的socket对象 ,配置参数, socket.SOCK_DGRAM(数据报)

udp_server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

udp_server.bind(('127.0.0.1',9999)) # 绑定服务端IP和端口

while 1 :

# 1. 接收任意客户端发送的数据

from_cli_msg=udp_server.recvfrom(1024)

# 接收到的是元组类型的数据, 包含客户端的IP和端口,客户端发来的字节数据

print(from_cli_msg)

# 格式化输出

print(f'来自{from_cli_msg[1]}的信息:{from_cli_msg[0].decode("utf-8")}')

# 2. 向客户端返回数据,

to_cli_msg=input('请输入回复消息:>>>').strip()

# 因为接收的数据中包含了客户端的的IP和地址

udp_server.sendto(to_cli_msg.encode('utf-8'),from_cli_msg[1])

总结:

sendto: 发送数据,包含两部分内容(字节形式数据,服务端的IP和地址)

recvfrom: 接收数据(1024)

​    udp是无链接,先启动哪一端都不会报错(无论服务端还是客户端发送数据,都不管另一方是否能接收到)

二丶基于socketserver实现并发

socketserver作用:

需要用它来实现并发,也就是同时可以和多个客户端进行通信

### 服务端

# -*-coding:utf-8-*-

# Author:Ds

import socketserver

# 这个请求类要继承BaseRequestHandler,并且还有重写父类里的handle()

class My_Server(socketserver.BaseRequestHandler):

def handle(self):

while 1:

# 接收数据

from_cli_data=self.request.recv(1024).decode('utf-8')

print(from_cli_data)

# 返回数据

## 服务器还是依次给客户端返回数据

to_cli_data=input('请输入要返回的消息:>>').strip()

self.request.send(to_cli_data.encode('utf-8'))

if __name__ == '__main__':

IP_PROT=('127.0.0.1',9999) # 定义 服务端的IP和端口

# 1.利用模块 socketserver 开启多线程TCP

# 2. 把端口和IP IP_PROT , 自定义请求处理类My_Server

server=socketserver.ThreadingTCPServer(IP_PROT,My_Server)

server.serve_forever() # 永远开启连接通道

### 客户端

## 可以开启多个客户端, 同时向服务器发送数据,

# -*-coding:utf-8-*-

# Author:Ds

import socket

client=socket.socket()

client.connect(('127.0.0.1',9999))

while 1:

ui=input('输入内:>>').strip()

client.send(ui.encode('utf-8'))

from_ser_data=client.recv(1024)

print(f'来自服务器的信息:{from_ser_data.decode("utf-8")}')

实例化ThreadingTCPServer()分析继承关系

8f203e6d3e9ad5bf5879341fa6978f4e.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++ 使用vs2010调用 win32api

以前读书时都是用vc6.0.后来学c#用vs。装系统只装了vs2010.今天用vs2010写c程序。发现有点陌生。就总结下,免得以后忘记。 首先用vs2010选择c语言。新建一个win32控制台程序。项目打开后会发现stdafx.h,targetver.h,stdafx.cpp还有自己的winA…

Java IO基准测试:Quasar与异步ForkJoinPool与ManagedBlock

“ Arien看到了我们运行的parallelStreams和ForkJoin基准测试的结果后,在Twitter上与我们联系。 这激起了他的兴趣,因此他进行了一些自己的测试,将Quasar纤维加入了混合物。 这是他的结果和结论。” –塔基皮(Takipi)A…

WP8开发札记(一)WP8应用生命周期管理

在介绍生命周期前,我们先了解两个相关的概念。 1、墓碑机制:WP8与Android采用的真后台机制不同,WP8采用的是墓碑机制。一旦从当前应用程序离开(非退出),该应用会被墓碑化,这样可以更好的管理&am…

python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...

第8.3节Python类的__init__方法深入剖析:构造方法与继承详解一、 引言上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类没有重写构造方法,Python将会给出默认的__init__方法…

OpenShift DIY:使用Gradle构建Spring Boot / Undertow应用程序

由于此bug, Gradle 1.6是在OpenShift上运行的最后一个受支持的Gradle版本。 但是从Gradle 2.2开始,这不再是问题,因此使用自己动手做墨盒在OpenShift上运行最新的Gradle不再是问题。 DIY墨盒是一种实验性墨盒,它提供了一种在OpenS…

P2P编程(十)

此为网络编程的一个系列,后续会把内容补上。。。。 转载于:https://www.cnblogs.com/liangjie/p/3155866.html

python默认数据转换_Python_数据类型转换

数据类型转换int(x [,base ]) 将x转换为一个整数long(x [,base ]) 将x转换为一个长整数float(x ) 将x转换到一个浮点数complex(real [,imag ]) 创建一个复数str(x ) 将对象 x 转换为字符串repr(x ) 将对象 x 转换为表达式字符串eval(str ) 用来计算在字符串中的有效Python表达式…

Gradle入门:创建Web应用程序项目

这篇博客文章描述了如何使用Gradle创建一个Web应用程序项目。 更具体地说,我们想创建一个使用Java的Web应用程序项目,将我们的Web应用程序打包到WAR文件中,并在开发环境中运行我们的Web应用程序。 让我们找出如何满足这些要求。 补充阅读&…

js编码java解码_Js编码和Java后台解码

注:在使用get提交,url传递参数的时候,会带来中文乱码的问题,对此可以使用js编码来解决。Js编码的几种方式区别:1.window.escape()与HttpUtility.UrlEncodeUnicode()编码格式一样:将一个汉字编码为%uxxxx格式…

使用JAX-RS和Jetty创建Web服务和Rest Server

用Java创建WebService非常容易。 将其添加到ServletContainer并将其部署到嵌入式WebServer仅需要几行代码。 让我们创建一个具有两个函数的简单计算器,作为WebService的示例。 计算器将计算任何数量的squareRoot和平方。 它将返回一个简单的JSON响应,其…

java填充二维数组_Java用Arrays.fill()初始化二维数组的实现

在最短路径问题上遇到了一个问题,对于二维int数组 map[][],需要初始化为int的最大值,不想用双重循环赋初值,想用Arrays.fill()填充但是失败了。。。。。。首先说明,Arrays.fill()并不能提高赋值的效率,在函数的内部也是…

maya 中使用节点连接来求余数:

绑个东西要用到求余,不喜欢用表达式,就想用节点连出来,找了下网上只有 镀金铆钉 在火星时代上的教程,不过不能下载了,就自己想了下,终于搞出来了,做下笔记,不要忘了。 求余的思路&a…

Java8多线程ForkJoinPool:处理异常

引入Java8 lambda背后的主要动机之一是能够尽可能轻松地使用多核的能力(请参阅精通Lambdas:多核世界中的Java编程 )。 只需将代码从collection.stream()...更改为collection.parallelStream()...您就可以使用即时多线程,从而为您的…

java web 登录界面案例_【JavaWeb】74:写一个登录案例

今天是刘小爱自学Java的第74天。感谢你的观看,谢谢你。话不多说,开始今天的学习:Java又常被称之为后台开发。什么叫后台呢?除了后台还有什么前台、前端后端……这些概念一大堆,还容易弄混。以一个三层架构的知识点来引…

7种JIRA集成可优化Java开发流程

有哪些最佳集成可以用来优化JIRA工作流程? 我喜欢寻找在工作流程中提高效率的方法。 看着那些小的自动化和流畅的流程,使我的脸上露出笑容。 我知道我并不孤单,偶尔花更多的时间来获得一点点提升以使其正常工作,而不是最终节省了我…

hive处理日志,自定义inputformat

开放环境,hadoop-0.20.2,hive-0.6 1.日志分隔符 Xml代码 2010-05-31 10:50:17|||61.132.4.82|||http://www.360buy.com/product/201185.html 2010-05-31 10:50:17|||61.132.4.82|||http://www.360buy.com/product/201185.html分隔符是“ ||| ”&#xf…

java 封箱_java封箱和拆箱分析

学习java肯定会涉及到“封箱”和“拆箱”,那么什么是“封箱”和“拆箱呢?我相信有不少的老师或者作者都对此做过总结,在这里就不详细说了。总的来说就是:装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包…

EE JSP:使用自定义标签库生成动态内容

在Web应用程序中开发View层时,您希望尽量不要重复JSP文件中的内容。 JSP spec API允许您通过使用标记库来减少这种重复。 定制JSP标记是用户定义的xml标记元素,您可以将其插入JSP文件以替换为某些动态内容。 这是一个使用自定义JSP标记的简单jsp示例 &a…

prefuse学习(一)用非数据库连接和xml的方式读入数据

prefuse正常的数据源需要从ConnectionFactory中生产出来,但是如果平时不想用里面给的方法得到数据,就需要手动创造Graph里面所需要的内容两个Table 下面是我自己写的从文件中读入数据的工具类 package wjl.util;import java.io.FileInputStream; import …

java list作为参数传递_Java 程序将lambda表达式作为方法参数传递

Java 程序将lambda表达式作为方法参数传递在此示例中,我们将学习将lambda表达式作为Java中的方法参数传递。要理解此示例,您应该了解以下Java编程主题:示例1:将lambda表达式定义为方法参数示例import java.util.ArrayList;class M…