使用python实现一个简单ping pong服务器

 更新时间:2023年04月20日 08:31:47   作者:真的不能告诉你我  
这篇文章主要为大家介绍了使用python实现一个简单ping pong服务器,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

依赖环境

本篇文章所依赖的python 环境如下:

计算机网络应用体系结构,一般有以下几种:

  • C/S架构: 也称为客户端/客户端架构。
  • P2P架构: 是一种分布式网络架构。
  • 混个结构: 客户端/服务器架构 和 P2P架构都包含在内。

我们该篇文章,将介绍c/s网络结构。

客户端/服务器架构介绍

什么是客户端/服务器架构

客户端/服务器架构,也被称之为C/S架构,它是一种互联网最常见的网络结构,我们熟知的web服务器也是使用的C/S架构。还有数据库应用等,也是使用的C/S架构。

如何使用

在此网络架构中,服务器若想和客户端进行网络通信,服务器需要提前启动。客户端随之向服务器发送请求,服务器接收并且处理请求,最后将结果发送会客户端。服务器和客户端之间通信协议使用的是TCPUDP,前置称之为有连接服务器,后则称之为无连接服务。至于更上层的应用协议,如http是使用的TCP协议,如dns是使用的是UDP+TCP协议。

客户端/服务器架构缺点

此架构也是有缺点的,例如: 如果服务器发现故障,所有已经连接到服务器的客户端都会收到影响,以及服务器容易出现性能瓶颈等。

python socket编程

python中,为我们提供了一个内置socket模块,我们可以以此来创建一个自己的tcp服务器。

来看一个最简单的例子:

import socket

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(("0.0.0.0",9999))
s.listen(5)

while True:
    client , addr = s.accept()
    print(client,addr)

上述代码,首先引入socket模块,而后定义了一个socket函数,传入必要参数,该函数会返回一个套接字对象给我们。

socket函数的参数分为2个,第1个参数需要指定网络协议,第二个参数需要指定套接字类型。下面是网络协议和套接字类型的说明:

网络协议

  • socket.AF_INET: 最常用的协议,代表IPv4协议族。
  • socket.AF_INET6: 代表IPv6协议族。
  • socket.AF_UNIX: 表示Unix文件描述符。

套接字类型

  • socket.SOCK_STREAM: 表示流式套接字(TCP)。
  • socket.SOCK_DGRAM: 表示数据包套接字(UDP)。
  • socket.SOCK_RAW: 表示原始套接字。

上述,我们使用的是IPv4协议,并且使用的是TCP流式套接字。

接着便是bind函数,它会将套接字绑定到指定的地址和端口上,参数必须是元组,分别为: 地址 和 端口号。

后续的listen函数,是指定套接字监听的最大连接数,如上述所示,表示最大连接数为5,为0则是不设置连接数。

最后是一个死循环,其中定义了accept函数,该函数用于等待客户端连接并且返回新的套接字对象。

代码在运行之后,我们可以使用telnet来访问一下,它会打印客户端信息,例如:

上述结果为打印了client信息,和client addr的地址。

写一个最简单的ping/pong服务

有了上述的python基础,我们可以来写一个最简单的ping/pong服务,不过我们想同时监听tcp流 和 udp数据包,代码如下:

上述代码,我们使用多线程,分为对当前主机的所有网卡监听了tcp端口8888udp端口8888,而后使用bind将套接字绑定到地址和端口,在监听tcp的时候,我们需要通过listen方法指定监听队列长度,而udp不用。

这是因为tcpudp协议不同导致的,tcp是可靠传输协议,所以当有新的请求来的时候,会通过accept方法接收新的连接,会产生一个新的socket对象。

udp是一种无连接不可靠协议,可以直接向目标主机发送数据,所以不需要先建立连接。而是直接调用recv方法接收数据。

接着便定义了一个空的列表threadJobs用于存放线程名称,而后便定义了2个线程,调用的方法是pingPongServer传入的参数是套接字类型和我们定义的套接字。

pingPongServer方法中,因为如上所述udp不需要accept,所以我们需要根据传入的套接字类型进行判断,若是tcp则执行accept,而后接收数据;若是udp,则直接接收数据即可。

启动服务器进程之后,我们分别使用telnetnc127.0.0.18888端口发送hello pdudo字符串,服务器接收到的信息为:

客户端发送数据后,接收到的信息如下:

一个简单的ping/pong服务器就写完了。

总结

本篇文章介绍了网络架构的分类,分为是 c/s架构、p2p架构 以及 网络架构;接着介绍了c/s架构的介绍以及优缺点。后面举了一个最简单的python socket的例子,最后实现了一个tcpudpping``pong小案例。

以上就是使用python实现一个简单ping pong服务器的详细内容,更多关于python ping pong服务器的资料请关注脚本之家其它相关文章!

相关文章

  • tensorflow 自定义损失函数示例代码

    tensorflow 自定义损失函数示例代码

    这篇文章主要介绍了tensorflow 自定义损失函数示例,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • pytorch 运行一段时间后出现GPU OOM的问题

    pytorch 运行一段时间后出现GPU OOM的问题

    这篇文章主要介绍了pytorch 运行一段时间后出现GPU OOM的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 在python 中split()使用多符号分割的例子

    在python 中split()使用多符号分割的例子

    今天小编就为大家分享一篇在python 中split()使用多符号分割的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python Numpy库datetime类型的处理详解

    Python Numpy库datetime类型的处理详解

    这篇文章主要介绍了Python Numpy库datetime类型的处理详解,Python中自带的处理时间的模块就有time 、datetime、calendar,另外还有扩展的第三方库,如dateutil等等。。当我们用NumPy库做数据分析时,如何转换时间呢?需要的朋友可以参考下
    2019-07-07
  • python Flask框架之HTTP请求详解

    python Flask框架之HTTP请求详解

    Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权,本篇我们来了解Flask框架中的HTTP请求
    2022-07-07
  • numpy和tensorflow中的各种乘法(点乘和矩阵乘)

    numpy和tensorflow中的各种乘法(点乘和矩阵乘)

    这篇文章主要介绍了numpy和tensorflow中的各种乘法(点乘和矩阵乘),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Python文件操作基础流程解析

    Python文件操作基础流程解析

    这篇文章主要介绍了Python文件操作基础流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python中的集合类型知识讲解

    Python中的集合类型知识讲解

    这篇文章主要介绍了Python中的集合类型知识讲解,是Python入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • Python + Flask 实现简单的验证码系统

    Python + Flask 实现简单的验证码系统

    这篇文章主要介绍了Python + Flask 制作一个简单的验证码系统,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • Python字符和字符值(ASCII或Unicode码值)转换方法

    Python字符和字符值(ASCII或Unicode码值)转换方法

    这篇文章主要介绍了Python字符和字符值(ASCII或Unicode码值)转换方法,即把字符串在ASCII值或者Unicode值之间相与转换的方法,需要的朋友可以参考下
    2015-05-05

最新评论