Python TCP

作者: iOSDevLog | 来源:发表于2019-06-11 17:22 被阅读0次

利用 python 的 socket 模块可以实现基本的网络编程,并且只限于一对一的连接。当然,也可以在其基础上实现一个网络服务器,但由于太底层这种做法不被推荐。

其实如果要实现一个网络服务器很简单,调用 Python 的内置模块 socketserver 就够了。

server 类

socketserver模块下面有四种套接字 server 类:

  • TCPserver
  • UDPServer
  • UnixStreamServer
  • UnixDatagramServer

前两种分别为使用 TCP 和 UDP 协议的 server 类,后两种用法和前面一样但只限于类 unix 系统。

它们的参数都一样,如下:

TCPServer(server_address, RequestHandlerClass, bind_and_activate=True)
  • server_address: IP 地址和端口,为一个元组如: ("127.0.0.1", 8000)
  • RequestHandlerClass: 一个自定义的 handle 类,主要负责实现连接到来时所要执行的操作。后面会介绍怎么自定义。
  • bind_and_activate: 默认为 True。如果设置为 False,代表你得手动操作底层的 socket,这样会更加灵活。

前面的四种类都继承自一个 BaseServer 类,实现了基本方法和属性:

  • fileno(): 返回一个服务器正绑定的socket文件描述符。
  • handle_requeset(): 处理一个请求。依次执行 get_request(), verify_request(), 和 process_request() 方法。用户自定义的handleclass下的handle方法抛出异常,服务器的handle_error()会被调用。
  • server_forever(poll_interval=0.5): 进入一个循环, 一直接收并处理请求直到一个显示的 shutdown() 请求到来。默认每隔0.5秒轮询(pull)一次。
  • shutdown(): 告诉server_forever()得到的循环结束循环。
  • server_address(): 返回正在监听的IP和端口,如:("127.0.0.1", 80)
  • socket: 正使用的socket对象
  • socket_type: socket类型,通常为:socket.SOCK_STREAM和socket.SOCK_DGRAM
  • timeout: 超时时间。

请求处理类

通常需要继承BaseRequestHandler,并重写hanle()方法。当一个网络请求被创建时,一个新的实例就会被创建。

class socketserver.BaseRequestHandler

方法如下:

  • setup(): 在handle()被调用前被执行,一般用于一些初始化操作。默认不执行任何操作。
  • handle(): 当一个请求到来后,用户所要执行操作,这个方法应该被重写,操作self.request。
  • finish(): handle之后调用的函数,用于执行一个清理工作。

Server 服务器代码如下:

import socketserver


class echorequestserver(socketserver.BaseRequestHandler):
    def handle(self):
        print('服务端启动...')
        conn = self.request
        print('获得连接:', self.client_address)
        while True:
            client_data = conn.recv(1024)
            if not client_data:
                print('断开连接')
                break
            print(client_data.decode('utf-8'))
            print('开始发送...')
            conn.sendall(client_data)


if __name__ == '__main__':
    server = socketserver.TCPServer(("127.0.0.1", 8000),
                                    echorequestserver)  # 使用处理单连接的TCPServer
    server.serve_forever()

Client 客户端代码如下:

import socket, time

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 8000))

while True:
    st = input("input command: ")
    if not st:
        break
    s.send(st.encode("utf-8"))

    echo_back = s.recv(1024)
    print(echo_back.decode("utf-8"))

s.close()

参考:利用python实现TCP和UDP服务器

相关文章

  • Python TCP编程

    Python网络编程之TCP 一、TCP协议 TCP协议,传输控制协议(Transmission Control ...

  • python tcp

    python tcp http://www.binarytides.com/python-socket-progr...

  • 【Python入门】39.网络编程

    摘要:网络编程的概念介绍;TCP/IP协议的基本介绍;介绍Python的socket库,在Python中进行TCP...

  • Python-socket模拟TCP通讯

    Python socket模拟TCP通讯 本文将介绍使用Python的socket模块创建TCP客户端和服务端的方...

  • [python|Go] python与Go之间的tcp通信-传输

    python与Go之间的tcp通信-传输json消息 python作为服务端, tcp作为客户端 传输多条json...

  • socket编程

    python实现socket编程 实现的主要过程是: tcp server: tcp client 函数 的实现原型:

  • 扣丁学堂Python开发之udp和tcp协议详解

    今天扣丁学堂Python培训老师给大家介绍一下关于Python基础开发中udp和tcp协议详解,TCP和UDP是O...

  • tcp和udp

    【Python网络编程】利用Python进行TCP、UDP套接字编程 http://www.cnblogs.com...

  • Python TCP

    利用 python 的 socket 模块可以实现基本的网络编程,并且只限于一对一的连接。当然,也可以在其基础上实...

  • 使用python进行tcp协议接口的并发测试

    进行 tcp 协议的接口测试 首先要了解tcp协议 以及可以使用python实现tcp协议如果之前没有掌握 可以查...

网友评论

    本文标题:Python TCP

    本文链接:https://www.haomeiwen.com/subject/vxtcfctx.html