网络编程基础-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 一起探讨。


相关文章
|
4天前
|
网络协议 算法 Java
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
17 3
|
1天前
|
网络协议 Unix 网络性能优化
|
1天前
|
Java 开发者 Spring
Java一分钟之-Java网络编程基础:Socket通信
【5月更文挑战第13天】本文介绍了Java Socket编程基础知识,包括使用`ServerSocket`和`Socket`类建立连接,通过`OutputStream`和`InputStream`进行数据传输。常见问题涉及忘记关闭Socket导致的资源泄漏、网络异常处理及并发同步。理解Socket通信原理并掌握异常处理、资源管理和并发控制,能帮助开发者构建更稳定的网络应用。
13 1
|
1天前
|
网络协议 Java 网络安全
【计算机网络】—— Socket通信编程与传输协议分析
【计算机网络】—— Socket通信编程与传输协议分析
4 0
|
1天前
|
开发框架 网络协议 Java
【计算机网络】—— 网络应用通信基本原理
【计算机网络】—— 网络应用通信基本原理
4 0
|
5天前
|
安全
AC/DC电源模块在通信与网络设备中的应用的研究
AC/DC电源模块在通信与网络设备中的应用的研究
AC/DC电源模块在通信与网络设备中的应用的研究
|
1月前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
1月前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
1月前
|
Python
Python网络编程基础(Socket编程) 使用try-except处理网络错误
【4月更文挑战第11天】在网络编程中,错误处理和异常管理是非常重要的部分。网络操作经常因为各种原因而失败,比如网络断开、服务器无响应、地址不正确等。因此,学会如何使用Python的异常处理机制来捕获和处理这些错误,是编写健壮的网络应用的关键。
|
1月前
|
网络协议 网络安全 Python
Python网络编程基础(Socket编程) 错误处理和异常
【4月更文挑战第10天】网络编程涉及到很多复杂的操作和潜在的风险,如连接失败、数据丢失、超时等问题。因此,正确的错误处理和异常捕获是确保网络程序稳定性和可靠性的关键。本章将介绍网络编程中常见的错误和异常,并探讨如何在Python中进行有效的错误处理。