网络编程基础-Socket编程(使用socketserver实现一对多通信)

简介: 由socket模块换成socketserver模块后,改动不大,主要是服务端的代码要进行改动,客户端的代码基本不用动。服务端要继承BaseRequestHandler类。这个类在初始化的时候,它会依次调用3个方法。子类可以覆盖这些方法。

在前面的文章中,介绍过如果使用socket进行客户端与服务端的通信,接下来介绍socketserver模块,可用于多客户端与服务端通信。

由socket模块换成socketserver模块后,改动不大,主要是服务端的代码要进行改动,客户端的代码基本不用动。

服务端要继承BaseRequestHandler类。这个类在初始化的时候,它会依次调用3个方法。子类可以覆盖这些方法。BaseRequestHandler类中的3个方法对应的源码如下:


微信图片_20220114144351.png


server端代码:

import socketserver
class mySocketServer(socketserver.BaseRequestHandler):
    def handle(self) -> None: # 每一次请求处理的时候执行
        while True:
            # 接收客户端数据
            client_data = str(self.request.recv(1024), encoding="utf-8")
            print("{} send:".format(self.client_address), client_data)
            if client_data in ['quit', 'exit']:
                print("connection lost")
                break
            # 发送数据
            send_data = input('请输入消息给' + client_data + ':')
            self.request.sendall(send_data.encode('utf-8'))
        self.request.close()
    def setup(self) -> None:  # 每一个连接初始化的时候执行
        print("before handle,连接建立:", self.client_address)
    def finish(self): # 每一个连接清理
        pass
ip_port = ("localhost", 9999)
server = socketserver.ThreadingTCPServer(ip_port, mySocketServer)
server.serve_forever()
#server.handle_request() #只接受一个客户端连接

client端代码:

import socket
ip_port = ('127.0.0.1', 9999)
# 1、创建socket对象
sk_obj = socket.socket()
# 2、连接服务端
sk_obj.connect(ip_port)
# 3、发送数据
while True:
    send_data = input('请输入要发送的数据:')
    sk_obj.sendall(send_data.encode('utf-8'))
    # 4、接收服务端数据
    server_data = sk_obj.recv(1024).decode('utf-8')
    if server_data is None or server_data == '':
        break
    print("接收到客户端的数据", server_data)
    # 5、关闭socket
sk_obj.close()

可以将client端的代码copy一份,命名为不同的文件名,然后一次启动server,client1,client2的脚本,就可以实现客户端和服务端的通信。并且在代码中加入循环后,就可以实现不停的对话,知道输入exit或者quit指令才会退出通信。

运行效果:


微信图片_20220114144355.png


今天先简单介绍一下socket通信的基本操作,至于后面在测开的平台中如何去使用这些技术,敬请期待后面的分享,待我学会了之后继续为大家分享~ 学习过程中遇到问题,可以加V:xiaobotester 一起探讨。


相关文章
|
2月前
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
78 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
3月前
|
安全 搜索推荐 网络安全
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
94 11
|
3月前
|
网络协议
计算机网络与通信
计算机网络基本概念:了解计算机网络的定义、功能、分类和拓扑结构(如总线型、星型、环型、树形、网状等)。 网络通信原理:了解网络通信的基本原理、协议和技术,如TCP/IP协议、网络通信设备等。
44 3
|
3月前
|
算法
数据结构之卫星通信网络(BFS)
本文介绍了卫星通信网络及其重要性,并探讨了广度优先搜索(BFS)算法在其中的应用。卫星通信网络通过在轨卫星提供全球覆盖的通信服务,尤其在偏远地区和紧急救援中发挥关键作用。BFS算法用于网络拓扑分析、路径规划和故障排除,确保通信网络的高效运行。文章还包括BFS算法的工作原理、特点、优缺点及其实现代码示例。
73 1
|
3月前
|
传感器 自动驾驶 物联网
探秘 5G 核心网络之 5G RAN:开启高速通信新时代
探秘 5G 核心网络之 5G RAN:开启高速通信新时代
110 4
|
3月前
|
网络协议 算法 数据库
OSPF 与 BGP 的互操作性:构建复杂网络的通信桥梁
OSPF 与 BGP 的互操作性:构建复杂网络的通信桥梁
71 0
|
3月前
|
边缘计算 5G 数据处理
5G网络能耗管理:绿色通信的实践
【10月更文挑战第30天】
64 0
|
7月前
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解
|
7月前
|
Java API 网络安全
Java网络编程入门
Java网络编程入门
|
7月前
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解

热门文章

最新文章