Python 套接字socketserver网络编程

为什么使用socketserver

虽然Python内置的socket和threading模块能实现简单的多线程服务器,在非正式环境,随便用用还是可以的,但是如果要在生产环境中使用,那是万万不够的。

Python考虑得很周到,为了满足我们对多线程网络服务器的需求,提供了"socketserver"模块。socketserver在内部使用IO多路复用以及多线程/进程机制,实现了并发处理多个客户端请求的socket服务端。每个客户端请求连接到服务器时,socketserver服务端都会创建一个“线程”或者“进程” 专门负责处理当前客户端的所有请求。

使用socketserver要点

  • 创建一个继承自"socketserver.BaseRequestHandler"的类;
  • 这个类中必须重写一个名字为"handle"的方法,不能是别的名字!
  • 将这个新建的类,连同服务器的IP和端口作为参数传递给"ThreadingTCPServer()"构造;
  • 手动启动"ThreadingTCPServer"。

栗子

服务端

import socketserver

# 必须继承socketserver.BaseRequestHandler类
class MySockServer(socketserver.BaseRequestHandler):
    def handle(self):
        # request里封装了所有请求的数据
        conn = self.request
        conn.sendall(‘欢迎访问socketserver服务器‘.encode())
        while True:
            data = conn.recv(1024).decode()
            if data == ‘exit‘:
                print(‘断开与%s的连接!‘ % (self.client_address,))  # 注意是元组!
                break
            elif data:
                print(‘来自%s客户端向你发来数据:%s‘ % (self.client_address, data))
                conn.sendall(‘服务器已收到数据‘.encode())

if __name__ == ‘__main__‘:
    # 创建一个多线程TCP服务器
    sock_server = socketserver.ThreadingTCPServer((‘127.0.0.1‘, 8888), MySockServer)
    print(‘启动服务器!‘)
    # 启动服务器,服务器将一直保持运行状态
    sock_server.serve_forever()

分析一下服务器端的代码,核心要点有这些:

  • 连接数据封装在"self.request"属性中!通过"self.request"对象调用"send()"和"recv()"方法。
  • "handle()"方法是整个通信的处理核心,一旦它运行结束,当前连接也就断开了(但其他的线程和客户端还正常),因此一般在此设置一个无限循环。
  • 注意"sock_server = socketserver.ThreadingTCPServer((‘127.0.0.1‘, 8888), MySockServer)"中参数传递的方法。
  • "sock_server.serve_forever()"表示该服务器在正常情况下将永远运行。

客户端

import socket

# 客户端依然使用socket模块就可以了,不需要导入socketserver模块

IP_PORT = (‘127.0.0.1‘, 8888)
sock = socket.socket()
sock.connect(IP_PORT)
sock.settimeout(0.5)
data = sock.recv(1024).decode()
print(‘接收返回数据:%s‘ % data)
while True:
    inp = input(‘输入要发送的数据:‘).strip()
    if not inp:
        continue
    sock.sendall(inp.encode())

    if inp == ‘exit‘:
        print(‘谢谢使用,再见!‘)
        break
    data = sock.recv(1024).decode()
    print(‘接收返回数据:%s‘ % data)

sock.close()

客户端的代码很好理解,依然使用socket模块就可以了,不需要导入socketserver模块。

  至此。

原文地址:https://www.cnblogs.com/wcwnina/p/8893693.html

时间: 2024-10-12 07:22:22

Python 套接字socketserver网络编程的相关文章

Python全栈【Socket网络编程】

Python全栈[socket网络编程] 本章内容: Socket IO多路复用(select) SocketServer 模块(ThreadingTCPServer源码剖析) Socket socket通常也称作"套接字" 用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式

python基础教程总结13——网络编程,

1.网络设计模块 1.1 socket模块 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认. 1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态. 2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字.为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套 接字的地址和端口号,然后就向服务器端套接字提出连接请求. 3)连接确认:是指

**.Python自学之路:网络编程

socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 1.首先来看一下简易版的客户端与服务器的搭建 客户端 #!/usr/bin/env python # -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',9999) #测试地址与端口 sk = socket.socket() #生成句柄 sk.conne

Python学习笔记九(UDP套接字和并发编程)

一.UDP套接字 服务端 from socket import * server = socket(AF_INET,SOCK_DGRAM) server.bind(("127.0.0.1",8080)) while True: data,client_addr = server.recvfrom(1024) server.sendto(data.upper(),client_addr) 客户端 from socket import * client = socket(AF_INET,S

Python套接字

1.客户端/服务器架构 什么是客户端/服务器架构?对于不同的人来说,它意味着不同的东西,这取决于你问谁以及描述的是软件还是硬件系统.在这两种情况中的任何一种下,前提都很简单:服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的"服务".它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多请求.另一方面,客户端因特定的请求而联系服务器,并发送必要的数据,然后等待服务器的回应,最后完成请求或给出故障的原因.服务器无限地运行下去,并不断地处理请求:而客户

第八篇:python基础_8 面向对象与网络编程

本篇内容 接口与归一化设计 多态与多态性 封装 面向对象高级 异常处理 网络编程 一. 接口与归一化设计 1.定义 (1)归一化让使用者无需关心对象的类是什么,只需要知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度. (2)归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合. 2.模拟接口 #!/usr/bin/env pyhon #encoding: utf-8 #auth: yanglei class Interface: #定义接口Interface类来模

Python面向对象进阶和socket网络编程-day08

写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self,name): self.name=name p = Chinese('standby') # 实例化一个对象 print(p) # 打印这个对象 --- <__main__.Chinese object at 0x0000000000B3A978> - 示例2: >&g

从零开始学Python第八周:网络编程基础(socket)

Socket网络编程 一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 套接字是一个双向的通信信道的端点.套接字可能在沟通过程,进程之间在同一台机器上,或在不同的计算机之间的进程 要创建一个套接字,必须使用Socket模块的socket.socket()方法 在socket模块中的一般语法: s = socket.

python面试题解析(网络编程与并发)

1.答: 应用层 与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的.例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层.但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层.示例:TELNET,HTTP,FTP,NFS,SMTP等. 表示层 这一层的主要功能是定义数据格式及加密.例如,FTP允许你选择以二进制或ASCII格式传输.如果选择二进制,那么发送方和接收方不改变文件的内容.如果选择ASCII格式,发