广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python32 Socket Serv
  • 357
分享到

Python32 Socket Serv

SocketServ 2023-01-31 07:01:24 357人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

类型 Socketserver有几种类型: class socketserver.tcpServer:用于TCPclass socketserver.UDPServer:用于UDPclass socketserver.UnixStrea

类型

  • Socketserver有几种类型:

    class socketserver.tcpServer:用于TCP
    class socketserver.UDPServer:用于UDP
    class socketserver.UnixStreamServer:用于Unix的TCP
    class socketserver.UnixDatagramServer:用于Unix的UDP

image_1c5nj6qe0gc61p8p17phkk3sgm9.png-83.3kB
TCPServer继承了BaseServer
UnixStreamServer继承了TCPServer

  • 创建socket server至少分以下几步:

    1、必须创建一个请求处理类,并且这个类要继承BaseRequestHandler,还要重写父类里的handle方法(跟客户端所有的交互都是在handle中写的)。
    2、必须要实例化一个协议server(如TCPServer),并且传递server ip和你上面创建的请求处理类,给这个TCPServer(实例化的时候将IP和请求处理类传给TCPServer)。
    3、然后可以根据上面的实例来处理请求:
    server.handle_request() #只处理一个请求
    server.handle_forever() #处理多个请求,永远执行(一般都是用这个)
    4、调用server_close()去关闭

server端:

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    '''第1步:创建处理类,继承Base。 客户端每一次请求过来都会实例化这个类'''

    def handle(self):
        '''第1步:重写handle方法,handle默认存在父类中代码是空的。 客户端所有交互都在handle中完成'''

        while True: #使其可以循环发送数据
            self.data = self.request.recv(1024).decode().strip()
            #这里的self.request.recv相当于之前用的conn.recv

            print ("{} wrote:".fORMat(self.client_address[0]))
            #打印客户端的IP地址信息

            print (self.data)
            #打印数据信息

            self.request.send(self.data.upper().encode('utf-8'))
            #传回数据给客户端,只是upper了一下
            #sendall就是重复调用send

if __name__ == "__main__":
    HOST,PORT = "localhost",9999

    server = socketserver.TCPServer((HOST,PORT),MyTCPHandler)
    #第2步:实例化TCPServer,并将IP和MyTCPHandler当做参数传给请求处理类
    #监听客户端的每一个请求,就会实例化MyTCPHandler这个类,拿MyTCPHandler的handle与客户端交互。

    server.serve_forever()
    #第3步:允许永远处理多个请求

client端:

import socket

client = socket.socket()
client.connect(('localhost',9999))

while True:

    msg = input(">>:").strip()
    if len(msg) == 0:continue
    client.send(msg.encode('utf-8'))
    data = client.recv(1024)
    print ("recv:",data.decode())

client.close()

client执行结果:
>>:abc
recv: ABC
>>:efg
recv: EFG
>>:hhh
recv: HHH
>>:

server执行结果:
127.0.0.1 wrote:
abc
127.0.0.1 wrote:
efg
127.0.0.1 wrote:
hhh

client断开后server报错:
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 53933)
Traceback (most recent call last):
  File "D:\python37\lib\socketserver.py", line 313, in _handle_request_noblock
    self.process_request(request, client_address)
  File "D:\python37\lib\socketserver.py", line 344, in process_request
    self.finish_request(request, client_address)
  File "D:\Python37\lib\socketserver.py", line 357, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "D:\python37\lib\socketserver.py", line 712, in __init__
    self.handle()
  File "E:/python/代码练习/A2.py", line 11, in handle
    self.data = self.request.recv(1024).decode().strip()
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
----------------------------------------
#可以看到这里报错ConnectionResetError: [WinError 10054]
修改server端:
import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):

    def handle(self):

        while True: #使其可以循环发送数据
           try: #使用try的话就不需要使用 if not data的方式来判断客户端断开时,无数据的情况了
                self.data = self.request.recv(1024).decode().strip()
                #这里的self.request.recv相当于之前用的conn.recv

                print ("{} wrote:".format(self.client_address[0]))

                print (self.data)

                self.request.send(self.data.upper().encode('utf-8'))
           except ConnectionResetError as e:
               print ("err:",e)
               break    #这里一定要break,不然就会一直死循环

if __name__ == "__main__":
    HOST,PORT = "localhost",9999

    server = socketserver.TCPServer((HOST,PORT),MyTCPHandler)

    server.serve_forever()

server执行结果:
127.0.0.1 wrote:
abc
127.0.0.1 wrote:
123
err: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
#客户端断开连接后,就通过断言的方式抓到错误了。

上面的代码目前还不能支持多并发,如果有多个并发,后面的并发就会被挂起; 如果要并发的话,需要修改一下代码。

image_1c5pi0sn51denhou1t7b14k91tlcm.png-5.3kB
通过ctrl点TCPServer
image_1c5pi2lgi1gj1qgo18hn8a01th013.png-4.3kB
可以看到TCPServer是继承了BaseServer
image_1c5pi3dgaqh51lvc1co817q5vn71g.png-3.8kB

修改server端:

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):

    def handle(self):

        while True: #使其可以循环发送数据
           try: #使用try的话就不需要使用 if not data的方式来判断客户端断开时,无数据的情况了
                self.data = self.request.recv(1024).decode().strip()

                print ("{} wrote:".format(self.client_address[0]))

                print (self.data)

                self.request.send(self.data.upper().encode('utf-8'))

           except ConnectionResetError as e:
               print ("err:",e)
               break    
if __name__ == "__main__":
    HOST,PORT = "localhost",9999

    server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
    # 上面的代码需要使用ThreadingTCPServer

    server.serve_forever()

client 1执行结果:
>>:test 1
recv: TEST 1
>>:

client 2执行结果:
>>:test 2
recv: TEST 2
>>:

client 3执行结果:
>>:test 3
recv: TEST 3
>>:

server 执行结果:
127.0.0.1 wrote:
test 1
127.0.0.1 wrote:
test 2
127.0.0.1 wrote:
test 3

image_1c5phqhfeomh1fbhptttajvl29.png-16.4kB
可以看到server端现在支持多并发,没有被挂起;每来一个请求会开启一个新线程与server交互;每个线程都是独立的,10个线程,就可以做10件事情。

通过ctrl点ThreadingTCPServer
image_1c5piagcm85rqmh56f1a2l161v1t.png-12.3kB
可以看到将TCPServer这个类传了进去
同时还传了ThreadingMixIn;TCPServer是负责与客户端交互,而多线程都是由ThreadingMixIn实现的。

ctrl点ThreadingMixIn
image_1c5pigho4pp5tcd6adtt1btr2a.png-30.6kB
这部分就是多线程的主要代码

--结束END--

本文标题: Python32 Socket Serv

本文链接: https://www.lsjlt.com/news/191343.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python32 Socket Serv
    类型 socketserver有几种类型: class socketserver.TCPServer:用于TCPclass socketserver.UDPServer:用于UDPclass socketserver.UnixStrea...
    99+
    2023-01-31
    Socket Serv
  • python32之ping
    使用Ulipad编辑的 #! /usr/bin/env python #coding=utf-8 ############# import subprocess import time...
    99+
    2023-01-31
    ping
  • python32指的是什么
    这篇文章将为大家详细讲解有关python32指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌...
    99+
    2023-06-14
  • Serv-U使用教程与设置教程(Serv-U个性化参数)
    Serv-U是一款功能强大的FTP服务器软件,可以用于文件传输和共享。以下是Serv-U的使用教程和设置教程,包括个性化参数的设置。...
    99+
    2023-08-09
    Serv-U
  • SERV-U 的配置文件详解
    SERV-U的目录文件结构说明 Servudaemon.exe serv-u的服务程序,主文件 Servudaemon.ini serv-u的配置文件,记录用户信息,服务器参数 Se...
    99+
    2022-11-21
    SERV-U 配置文件
  • python之ftp单线程模拟,serv
    __author__ = 'neu'import socketimport osimport hashlibserver = socket.socket()          #初始化socketserver.bind(('localhos...
    99+
    2023-01-30
    单线程 python ftp
  • python中socket与socket
    一、socket模块socket又叫套接字,是网络编程中的一个基本组件,是两个端点的程序之间的“信息通道”程序可分布在不同的计算机上(通过网络连接),通过socket套接字相互发送信息。python中的大多数的网络编程都 隐藏了socket...
    99+
    2023-01-31
    python socket
  • ORA-26914: Unable to communicate with string capture process “string” from outbound serv
    文档解释 ORA-26914: Unable to communicate with string capture process “string” from outbound server “strin...
    99+
    2023-11-05
    报错 故障 communicate
  • Serv-U 本地服务器密码错误的解决方法
    服务器上的serv_u 点击本地服务器,输入了正确的密码但提示“本地服务器密码错误”的解决方法。这类原因一般是 Serv-U程序错误,或密码被黑客修改了,注意检查后门。修复方法:这个...
    99+
    2022-11-21
    Serv-U 本地服务器 密码错误
  • Serv-U 批量帐号管理及申请(Access+Asp) 图文方法
    1.首先下载Asp程序,在下载中包含Serv-U所需要的数据库,名为Serv#U.mdb.2.建立系统数据源:ftp,通过ODBC进行数据库连接,连接到Serv#U.mdb.步骤如图...
    99+
    2022-11-21
    Serv-U 帐号管理
  • python socket
    1、TCP链接 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。所以在进行TCP链接时首先要开启服务器端口。 TCP服务端一般有几个步骤: ①  sk = socket.socket(socket.AF_INET, socke...
    99+
    2023-01-30
    python socket
  • python之socket
    python之socket一、初识socket        socket 是网络连接端点,每个socket都被绑定到一个特定的IP地址和端口。IP地址是一个由4个数组成的序列,这4个数均是范围 0~255中的值(例如,220,176,36...
    99+
    2023-01-31
    python socket
  • python 3 socket
    server.py:import socketdef main():    host = '127.0.0.1'    port = 5000    server_socket = socket.socket()    server_soc...
    99+
    2023-01-31
    python socket
  • python socket window
    python socket 在本机跑成功后 在服务器端 将服务器端的代码放上去 却发现 跑不动关掉服务器的windows 防火墙 就没有问题了 可以跑但是 担心不安全;在服务器防火墙的高级安全设置 里面 新建 入站规则 选择 端口  然后 ...
    99+
    2023-01-31
    python socket window
  • Python thread socket
    从网上参考了一些代码,实现了一个Python实现的基于线程的socket server, 用来实现各种服务系统的原型。放在这里供以后参考。 #!/usr/bin/env python import threading&...
    99+
    2023-01-31
    Python thread socket
  • socket编程
    1.socket编程的概念socket通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过”套接字”向网络发出请求或者应答网络请求;socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件...
    99+
    2023-06-02
  • TCP socket和web socket的区别是什么
    TCP socket和web socket的区别是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先我们来阅读这段有166个赞的回答:When you send byt...
    99+
    2023-06-04
  • MySQL远程连接提示ERROR 2003 (HY000):Can’t connect to MySQL serv的解决方法
    本篇内容介绍了“MySQL远程连接提示ERROR 2003 (HY000):Can’t connect to MySQL serv的解决方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接...
    99+
    2022-10-18
  • python socket学习
    一、简单实例:实现客户端向服务端发送的信息,服务器收到信息后加上当前时间再返回给客户端服务端实现:#!/usr/bin/python import socket, traceback, time host = '' port = 8000 ...
    99+
    2023-01-31
    python socket
  • python socket编程
    socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开...
    99+
    2023-01-31
    python socket
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作