使用python实现一个简单ping pong服务器
作者:真的不能告诉你我 发布时间:2022-10-25 03:38:48
依赖环境
本篇文章所依赖的python
环境如下:
计算机网络应用体系结构,一般有以下几种:
C/S
架构: 也称为客户端/客户端架构。P2P
架构: 是一种分布式网络架构。混个结构: 客户端/服务器架构 和
P2P
架构都包含在内。
我们该篇文章,将介绍c/s
网络结构。
客户端/服务器架构介绍
什么是客户端/服务器架构
客户端/服务器架构,也被称之为C/S
架构,它是一种互联网最常见的网络结构,我们熟知的web
服务器也是使用的C/S
架构。还有数据库应用等,也是使用的C/S
架构。
如何使用
在此网络架构中,服务器若想和客户端进行网络通信,服务器需要提前启动。客户端随之向服务器发送请求,服务器接收并且处理请求,最后将结果发送会客户端。服务器和客户端之间通信协议使用的是TCP
和UDP
,前置称之为有连接服务器,后则称之为无连接服务。至于更上层的应用协议,如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
端口8888
和udp
端口8888
,而后使用bind
将套接字绑定到地址和端口,在监听tcp
的时候,我们需要通过listen
方法指定监听队列长度,而udp
不用。
这是因为tcp
和udp
协议不同导致的,tcp
是可靠传输协议,所以当有新的请求来的时候,会通过accept
方法接收新的连接,会产生一个新的socket
对象。
而udp
是一种无连接不可靠协议,可以直接向目标主机发送数据,所以不需要先建立连接。而是直接调用recv
方法接收数据。
接着便定义了一个空的列表threadJobs
用于存放线程名称,而后便定义了2个线程,调用的方法是pingPongServer
传入的参数是套接字类型和我们定义的套接字。
在pingPongServer
方法中,因为如上所述udp
不需要accept
,所以我们需要根据传入的套接字类型进行判断,若是tcp
则执行accept
,而后接收数据;若是udp
,则直接接收数据即可。
启动服务器进程之后,我们分别使用telnet
和nc
向127.0.0.1
的8888
端口发送hello pdudo
字符串,服务器接收到的信息为:
客户端发送数据后,接收到的信息如下:
一个简单的ping/pong
服务器就写完了。
来源:https://juejin.cn/post/7223767530981670949
猜你喜欢
- 人常常感受到色彩对自己心理的影响,这些影响总是在不知不觉中发挥作用,左右我们的情绪。色彩的心理效应发生在不同层次中。有些属直接的刺激,有些要
- 1.切片# 切片:取list或tuple的部分元素nameList = ["Willard","ChenJD&
- 本文实例为大家分享了Python画圣诞树的具体代码,供大家参考,具体内容如下源代码from turtle import *import ra
- 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思?函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进
- 任何熟悉SQL和关系数据库的人都遇见过大量的连接类型。最简单的说,连接(join)会把两个表的内容组合到一个虚拟表或者recordset内。
- 一、利用外键约束更新MySQL中的数据现在,最流行的开源关系型数据库管理系统非MySQL莫属,而MySQL又支持多个存储引擎,其中默认的也是
- Web技术的发展速度太快了,如果你不与时俱进,就会被淘汰。因此,为了应对即将到来的HTML5,本文总结了22个HTML5的初级技巧,希望能对
- 上次的故事是这样的前女友发来加密的"520快乐.pdf",我用python破解开之后,却发现...事情是这样的小哥哥还是
- 英文版:File -> settings -> Editor -> File Encodings首先打开设置:文件 -&g
- 我们之前要想在调度里面实现延时执行,我们可以使用管道阻塞,直到有人往管道里面写东西才变通畅,还可以使用sleep来睡觉,但是睡觉的过程,协程
- 本文研究的主要是Django中Forms的使用,具体如下。创建文件do.html{% extends 'base.html'
- 先给大家介绍下python交互模式下输入换行/输入多行命令的方法换行方法 \如:>>> print 'aaa
- 本文实例讲述了Python开发的实用计算器。分享给大家供大家参考,具体如下:实现功能:图形界面PyQt,输入框,+,—,*,/ ;乘方 ,开
- 出现这样的问题是当你浏览UTF-8编码的时候,服务器默认用UTF-8的引擎来输出html,当你用再浏览GB2312的页面时,它还是用UTF-
- 本文实例讲述了Python实现链表反转的方法。分享给大家供大家参考,具体如下:Python实现链表反转链表反转(while迭代实现):链表的
- COOKIE函数库:cookie.inc.php3 <?php if (!isset($__cookie_inc__)){ $__co
- 本文主要是总结利用tensorflow实现迁移学习的基本步骤。所谓迁移学习,就是将上一个问题上训练好的模型通过简单的调整使其适用于一个新的问
- redux-saga在学习它之前先了解es6生成器生成器关键字:yield next()定义函数需要在函数名前急+*号function *t
- 命令行进入python打开cmd——>直接输入python即可,如下退出python方法一:先按Ctrl+z,再按Enter(回车键)
- 很久以前写过如何成为优秀的设计师,近半年来经常做设计评审,有很多感触,顺便写一点下来,我们的Blog也应该有更高的更新频率。言归正传,我认为