python网络编程之多线程同时接受和发送

  

一、什么是Python网络编程之多线程同时接受和发送?

Python网络编程是指使用Python语言实现网络通信的过程,包括传输协议、网络编程框架、数据交互等。多线程同时接受和发送是指一个Python网络应用程序可以同时处理多个客户端的接入请求,并且能在同时接收和发送数据时保持正常运行。

在多线程同时接受和发送的过程中,一个Python服务器可以同时处理多个客户端连接请求,并在接收到客户端发送的数据后,可以向其发送响应数据。这可以有效提高服务器的并发能力,满足高并发访问的需求。

二、Python网络编程之多线程同时接受和发送的完整攻略

  1. 创建主线程和子线程

在Python网络编程中,一个服务器程序需要先创建一个主线程,用来监听客户端的连接请求,并处理客户端的请求。当有客户端连接进来时,主线程会创建一个子线程,用来与该客户端进行通信。

import threading
import socket

class ServerThread(threading.Thread):
    def __init__(self, conn, addr):
        threading.Thread.__init__(self)
        self.conn = conn
        self.addr = addr

    def run(self):
        with conn:
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                conn.sendall(data)
                print("{} sent: {}".format(self.addr, data))
  1. 创建主线程的监听套接字

在Python网络编程中,服务器需要创建监听套接字,用来接收客户端的连接请求。以下代码演示了如何创建监听套接字。

HOST = '127.0.0.1'  # Standard loopback interface address (localhost)
PORT = 65432        # Port to listen on (non-privileged ports are > 1023)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    print('waiting for connection')

    while True:
        conn, addr = s.accept()
        print('connected by', addr)

        ServerThread(conn, addr).start()
  1. 创建子线程之间的通信

在Python网络编程中,子线程需要与主线程进行通信。子线程通过调用主线程的函数来向客户端发送数据,而主线程通过调用子线程的函数来接收客户端发送的数据。以下代码演示了如何在父子线程之间进行通信。

class ServerThread(threading.Thread):
    def __init__(self, conn, addr):
        threading.Thread.__init__(self)
        self.conn = conn
        self.addr = addr

    def run(self):
        with conn:
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                conn.sendall(data)
                print("{} sent: {}".format(self.addr, data))

                # communicate with main thread
                response = input()
                conn.sendall(response.encode())
  1. 错误处理

在Python网络编程中,需要处理各种可能的错误情况。以下代码演示了如何处理错误:

class ServerThread(threading.Thread):
    def __init__(self, conn, addr):
        threading.Thread.__init__(self)
        self.conn = conn
        self.addr = addr

    def run(self):
        with conn:
            while True:
                try:
                    data = conn.recv(1024)
                    if not data:
                        break
                    conn.sendall(data)
                    print("{} sent: {}".format(self.addr, data))

                    # communicate with main thread
                    response = input()
                    conn.sendall(response.encode())

                except Exception as e:
                    print("Exception: {}".format(e))
                    break
  1. 完整示例

下面是一个完整的Python服务器应用程序,可以实现多线程同时接受和发送功能。

import threading
import socket

class ServerThread(threading.Thread):
    def __init__(self, conn, addr):
        threading.Thread.__init__(self)
        self.conn = conn
        self.addr = addr

    def run(self):
        with conn:
            while True:
                try:
                    data = conn.recv(1024)
                    if not data:
                        break
                    conn.sendall(data)
                    print("{} sent: {}".format(self.addr, data))

                    # communicate with main thread
                    response = input()
                    conn.sendall(response.encode())

                except Exception as e:
                    print("Exception: {}".format(e))
                    break

if __name__ == '__main__':
    HOST = '127.0.0.1'  # Standard loopback interface address (localhost)
    PORT = 65432        # Port to listen on (non-privileged ports are > 1023)

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))
        s.listen()
        print('waiting for connection')

        while True:
            conn, addr = s.accept()
            print('connected by', addr)

            ServerThread(conn, addr).start()

三、Python网络编程之多线程同时接受和发送的示例说明

以下是两个示例代码,分别演示了如何实现Python网络编程之多线程同时接受和发送功能。

  1. 示例代码1
import threading
import socket

class ServerThread(threading.Thread):
    def __init__(self, conn, addr):
        threading.Thread.__init__(self)
        self.conn = conn
        self.addr = addr

    def run(self):
        with conn:
            while True:
                try:
                    data = conn.recv(1024)
                    if not data:
                        break
                    conn.sendall(data)
                    print("{} sent: {}".format(self.addr, data))

                    # communicate with main thread
                    response = input()
                    conn.sendall(response.encode())

                except Exception as e:
                    print("Exception: {}".format(e))
                    break

if __name__ == '__main__':
    HOST = '127.0.0.1'  # Standard loopback interface address (localhost)
    PORT = 65432        # Port to listen on (non-privileged ports are > 1023)

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))
        s.listen()
        print('waiting for connection')

        while True:
            conn, addr = s.accept()
            print('connected by', addr)

            ServerThread(conn, addr).start()

在上述示例代码中,首先创建了一个ServerThread类,用来处理每个客户端连接请求。在该类中,通过调用socket库中的recv()函数,可以接受客户端发送的数据,并通过sendall()函数向客户端发送响应数据。同时,该类的run()方法还演示了如何在子线程和主线程之间进行通信,并能处理异常情况。

在main()函数中,创建了一个监听套接字,用来接受客户端连接请求。当有客户端连接进来时,就会创建一个ServerThread对象,并启动子线程来处理客户端请求。

  1. 示例代码2
import socket
import threading

def handle_client(conn, addr):
    with conn:
        while True:
            try:
                data = conn.recv(1024)
                print("{} sent: {}".format(addr, data))
                if not data:
                    break
                conn.sendall(data)
            except:
                print("Exception")
                break

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind(('localhost', 9999))
    s.listen()

    while True:
        conn, addr = s.accept()
        print('Connected by', addr)
        t = threading.Thread(target=handle_client, args=(conn, addr))
        t.start()

在上述示例代码中,通过socket库创建了一个监听套接字,并通过listen()函数开始侦听客户端连接请求。当有客户端连接进来时,创建了一个子线程来处理客户端的请求,并启动该子线程。在子线程中,通过调用socket库中的recv()函数,可以接受客户端发送的数据,并通过sendall()函数向客户端发送响应数据。同时,该子线程还能处理异常情况。

最后,不断接收客户端请求,并启动子线程来处理客户端请求,实现了多线程同时接受和发送数据的功能。

相关文章