python如何创建TCP服务端和客户端

当我们需要在本机或者远程服务器上实现进程间通信,就需要使用到TCP(Transmission Control Protocol)套接字编程。在Python中,我们使用socket库来实现TCP服务端和客户端。

如何创建TCP服务端

  1. 导入socket库模块
import socket
  1. 创建套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

创建方式解释:

  • AF_INET:使用IPv4协议;
  • SOCK_STREAM:使用TCP协议;

  • 绑定地址和端口

server_socket.bind(('127.0.0.1', 8888))

bind()方法接收一个元组类型参数,元组中的第一个元素为IP地址,第二个元素为端口号。

  1. 开启监听
server_socket.listen(5)

listen()方法的参数为最大连接数,一旦有超过设置的最大连接数的请求,其他连接会被拒绝。

  1. 接受客户端连接
client_socket, client_address = server_socket.accept()

accept()方法返回两个参数:客户端套接字和客户端地址。

  1. 接收和发送数据
recv_data = client_socket.recv(1024).decode('utf-8')
client_socket.send('Hello, client!'.encode('utf-8'))

recv()方法用于接收数据,参数为最大接收字节数;send()方法用于发送数据,但需要将数据编码为bytes类型,在发送前需要使用encode()方法进行编码,接收后需要使用decode()方法进行解码。

  1. 关闭套接字
client_socket.close()
server_socket.close()

如何创建TCP客户端

  1. 导入socket库模块
import socket
  1. 创建套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

创建方式解释:

  • AF_INET:使用IPv4协议;
  • SOCK_STREAM:使用TCP协议;

  • 连接到服务端

client_socket.connect(('127.0.0.1', 8888))

connect()方法接收一个元组类型参数,元组中的第一个元素为IP地址,第二个元素为端口号。

  1. 发送和接收数据
client_socket.send('Hello, server!'.encode('utf-8'))
recv_data = client_socket.recv(1024).decode('utf-8')

send()方法用于发送数据,但需要将数据编码为bytes类型,在发送前需要使用encode()方法进行编码,接收后需要使用decode()方法进行解码;recv()方法用于接收数据,参数为最大接收字节数。

  1. 关闭套接字
client_socket.close()

示例说明

这里提供两个示例来说明如何实现TCP服务端和客户端。

示例一:简单的TCP服务端和客户端交互

服务端代码:

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 8888))
server_socket.listen(5)

print('Waiting for connection...')

client_socket, client_address = server_socket.accept()
print('Connected by', client_address)

while True:
    recv_data = client_socket.recv(1024).decode('utf-8')
    if not recv_data:
        break
    print('Received message: ', recv_data)
    client_socket.send(f"Server: {recv_data}".encode('utf-8'))

client_socket.close()
server_socket.close()

客户端代码:

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 8888))

while True:
    message = input('Please input message: ')
    if not message:
        continue
    client_socket.send(message.encode('utf-8'))
    recv_data = client_socket.recv(1024).decode('utf-8')
    print('Received message: ', recv_data)

client_socket.close()

在打开服务端和客户端的终端并分别运行服务端和客户端代码后,客户端控制台会不断提示输入消息,在输入消息后服务端将会直接对消息进行回显。

示例二:TCP服务端并发处理客户端请求

服务端代码:

import socket
import threading


def handle_client(client_socket, client_address):
    while True:
        recv_data = client_socket.recv(1024).decode('utf-8')
        if not recv_data:
            break
        print(f'Received message from {client_address}: {recv_data}')
        client_socket.send(f"Server: {recv_data}".encode('utf-8'))
    client_socket.close()


server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 8888))
server_socket.listen(5)

while True:
    print('Waiting for connection...')
    client_socket, client_address = server_socket.accept()

    client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
    client_thread.start()

server_socket.close()

客户端代码:

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 8888))

while True:
    message = input('Please input message: ')
    if not message:
        continue
    client_socket.send(message.encode('utf-8'))
    recv_data = client_socket.recv(1024).decode('utf-8')
    print('Received message: ', recv_data)

client_socket.close()

在打开服务端和客户端的终端并分别运行服务端和客户端代码后,客户端控制台依然会不断提示输入消息,在输入消息后服务端将会打印出相应的信息,并且在多个客户端同时连接时,服务端也能够并发处理客户端请求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python如何创建TCP服务端和客户端 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • python密码学换位密码及换位解密转置加密教程

    Python密码学教程——换位密码及换位解密转置加密 什么是换位加密法 在密码学中,换位加密法(Transposition Cipher)是一种加密方式,它将明文中各个字符的位置调换来生成密文,从而达到加密的目的。具体来说,它将纯文本中的字符重新排列,但是不会改变字符本身。 换位加密法的分类 简单换位密码:将明文中的字符位置进行交换和调整,从而得到密文。 复…

    python 2023年5月20日
    00
  • 关于Pycharm安装第三方库超时 Read time-out的问题

    当在Pycharm中安装第三方库时,有时会出现“Read timed out”的错误,这是因为在下载过程中连接超时导致的。以下是解决此问题的完整攻略。 问题原因 Pycharm在安装第三方库时,会从PyPi(Python Package Index)进行下载。但是由于网络原因或服务器端限制,可能会导致下载过程中连接超时。 解决方法 方法一:更改PyPi镜像源…

    python 2023年5月13日
    00
  • python argparse命令行参数解析(推荐)

    Python argparse命令行参数解析(推荐) 介绍 在Python开发中,命令行参数解析是一项非常重要的任务。Python标准库中提供了argparse模块用于解析命令行参数。argparse具有强大的功能,可以解析不同类型的参数,并根据需要生成帮助信息。 安装argparse argparse是Python标准库的一部分,因此不需要安装。我们只需要…

    python 2023年6月3日
    00
  • python实现监控某个服务 服务崩溃即发送邮件报告

    下面是详细讲解Python实现监控某个服务服务崩溃即发送邮件报告的完整攻略。 简介 在开发和部署过程中,我们不可避免得会遇到一些服务崩溃的问题。而一旦服务崩溃,我们需要尽快定位问题,所以当服务崩溃时,能够实时地向我们发送邮件报告是非常必要的。本攻略将介绍如何使用Python来实现监控某个服务,并在服务崩溃时发送邮件报告。 实现过程 安装必要的模块 首先,我们…

    python 2023年5月13日
    00
  • Python使用min、max函数查找二维数据矩阵中最小、最大值的方法

    要查找二维数据矩阵中的最小、最大值,可以使用Python中的min()和max()函数,这两个函数都支持接收可迭代对象作为输入参数。 1. 查找二维数据矩阵中的最小值 要查找二维数据矩阵中的最小值,可以将二维矩阵展开为一维数组,然后再使用min()函数查找最小值。下面是一个示例代码: matrix = [[1, 2, 3], [4, 5, 6], [7, 8…

    python 2023年6月5日
    00
  • 使用PyQtGraph绘制精美的股票行情K线图的示例代码

    使用PyQtGraph绘制股票K线图的攻略可以分为以下几个步骤: 安装PyQtGraph PyQtGraph是一个用于科学计算的Python图形库,支持多种图形类型,如曲线图、散点图和3D图。可以通过在命令行中输入以下命令安装: pip install pyqtgraph 导入所需库和数据 在代码中导入所需的PyQtGraph库和其他必要的库。然后,使用pa…

    python 2023年6月6日
    00
  • 利用Python判断文件的几种方法及其优劣对比

    以下是利用Python判断文件的几种方法及其优劣对比的攻略。 一、判断文件是否存在 在Python中,我们可以使用os.path模块中的exists()函数来判断文件是否存在。具体操作示例如下: import os file_path = ‘path/to/file.txt’ # 替换为目标文件的路径 if os.path.exists(file_path)…

    python 2023年6月2日
    00
  • python 如何求N的阶乘

    求一个数的阶乘是一个常见的问题,对于Python来说,实现起来非常简单。下面是Python求一个数n的阶乘的完整攻略: 实现方式一:使用循环语句 在Python中,我们可以使用for循环语句来求解一个数n的阶乘。具体实现过程如下: # 定义一个函数,输入为一个整数n def factorial(n): ans = 1 for i in range(1, n+…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部