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

yizhihongxing

当我们需要在本机或者远程服务器上实现进程间通信,就需要使用到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函数特性及使用方法的完整攻略。 函数特性 函数是一段可执行代码,将一组值作为输入来处理,并返回一个值作为输出。Python函数的一些特性如下: 可以有默认参数,缩短调用代码; 可以有不定长参数,可处理可变数量的参数; 可以返回多个值; 可以嵌套多层函数; 可以将函数作为参数传递给其他函数。 函数定义 定义一个函数,需要使用 def 关键字…

    python-answer 2023年3月25日
    00
  • Python操作Excel插入删除行的方法

    Python操作Excel插入删除行的方法 Python是一门十分强大的语言,也已经成为了数据分析师、开发者等行业中必备的技能之一。在数据处理的过程中,Excel是常见的电子表格软件,而Python的pandas库中也有处理Excel表格的工具,我们可以通过Python对Excel进行操作。 在使用Python处理Excel表格时,有时候我们需要对表格中的数…

    python 2023年5月14日
    00
  • python调用外部程序的实操步骤

    当我们需要在 Python 中执行一些本地系统的运行程序时,可以使用 Python 内置的 subprocess 模块进行调用。 以下是调用外部程序的实际步骤: 1.导入 subprocess 模块: python import subprocess 2.指定需要调用的外部程序的路径以及执行的参数: python cmd = [‘program_path’,…

    python 2023年5月31日
    00
  • python实现在字符串中查找子字符串的方法

    Python实现在字符串中查找子字符串的方法 在Python中查找一个字符串中是否包含另一个子串,有以下几种方法可以实现。 方法一:使用in操作符 Python提供了in操作符,可以用来检查一个字符串是否包含另一个子串。 string = "hello world" substring = "world" if sub…

    python 2023年6月5日
    00
  • Python 函数头等对象

    Python 中的函数不仅仅是执行代码的一段程序,还可以被当做一个对象来使用。这种特殊的对象被称为函数头等对象,也就是函数可以像变量一样直接使用。在这里,我们将详细说明如何使用Python函数头等对象以及常见的用法。 函数头等对象的使用方法 获取函数对象: Python 中定义函数后,可以通过直接将函数名赋值给变量来获取函数头等对象。例如,f = funct…

    python-answer 2023年3月25日
    00
  • 深入理解python中函数传递参数是值传递还是引用传递

    深入理解Python中函数传递参数是值传递还是引用传递是一个常见的问题。在Python中,可以说参数传递并非严格意义上的值传递或引用传递,而是一种比较特殊的“对象引用传递”。 Python中的参数传递 Python中的“对象引用传递”是指:在函数调用时,参数传递进去的是引用,而不是变量的值。当变量是不可变对象(如number、string、tuple)时,因…

    python 2023年6月5日
    00
  • Python中列表和元组的相关语句和方法讲解

    在Python中,列表和元组是两种常用的数据结构。它们都可以用于存储多个元素,但在使用上有一些区别。下面是详细的讲解和示例说明。 列表的定义 在Python中,列表是一种有序的可变数据结构,可以存储任意类型的元素。列表使用方括号[]来定义,元素之间用逗号分隔。下面是一个示例: # 定义一个列表 my_list = [1, ‘hello’, 3.14, Tru…

    python 2023年5月13日
    00
  • Python实现图片裁剪的两种方式(Pillow和OpenCV)

    Python实现图片裁剪的两种方式(Pillow和OpenCV) 本篇文章将会讲解使用Python代码实现图片裁剪的两种方式:Pillow和OpenCV。Pillow是Python图像处理库,它可以打开、操作和保存多种图像文件格式。OpenCV是计算机视觉和机器学习领域使用广泛的开发库,它提供了很多图像和视频处理的工具。本文将会提供Pillow和OpenCV…

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