• python实现TCPclient


    python实现TCPclient是一件简单的事情,只要通过socket这个模块就可以实现。

    一、实现步骤

    1、导入模块:

    首先,你需要导入Python的socket模块。

    import socket
    

    2、创建Socket对象:

    使用socket.socket()函数创建一个新的socket对象。

    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    

    这里,AF_INET表示使用IPv4地址族,SOCK_STREAM表示使用TCP协议。

    3、连接到服务器:

    使用connect()方法连接到服务器。传入服务器的IP地址和端口号。

    1. server_address = ('server_ip', port_number)
    2. client_socket.connect(server_address)

    4、发送数据:

    使用send()方法发送数据到服务器。

    1. message = 'Hello, server!'
    2. client_socket.send(message.encode())

    这里需要使用encode()将字符串转换为字节流,因为socket发送的是字节流。

    5、接收数据:

    使用recv()方法接收从服务器发送过来的数据。

    1. data = client_socket.recv(1024)
    2. print('Received from server:', data.decode())

    同样,需要使用decode()将接收到的字节流转换为字符串。

    6、关闭连接:

    使用close()方法关闭客户端socket连接。

    client_socket.close()
    

    二、关于实现过程中的问题

    1、socket.socket的参数有哪些,如何设置这些参数?

    socket.socket() 函数用于创建一个新的 socket 对象。它接受4个参数,但通常只要设置前2个参数:

    (1)family(地址族,Address Family)

    即Address Family (地址族,AF): 指定网络地址的类型。常用的有:

    socket.AF_INET:IPv4 地址族,用于 Internet。
    socket.AF_INET6:IPv6 地址族,用于 Internet。
    socket.AF_UNIX 或 socket.AF_FILE:用于 Unix 域(本地连接)。


    (2)type(套接字类型,Socket Type):

    即Socket Type (套接字类型,Type): 指定 socket 的类型。常用的有:

    socket.SOCK_STREAM:用于 TCP 协议,提供面向连接的稳定数据传输,即 TCP 套接字。
    socket.SOCK_DGRAM:用于 UDP 协议,提供不稳定但是快速的数据传输,即 UDP 套接字。

    (3)proto(协议类型,Protocol):

    这个参数通常用于指定特定的协议。在大多数情况下,它不需要指定,会使用默认值-1。

    (4)fileno(文件描述符,File Descriptor):

    这个参数允许你将一个现有的文件描述符包装成一个套接字对象。如果提供了这个参数,familytypeproto参数的值将会被忽略。

    2、recv必须是1024么?

    不一定,在 socket.recv(buffer_size) 中,buffer_size 参数指定了一次性接收数据的最大字节数。理论上你可以将 buffer_size 设置得非常大,但是实际上会有一些限制:

    (1)操作系统的限制:

    操作系统通常会有单次数据传输的最大字节数限制,这个限制取决于操作系统的配置。

    (2)网络的限制:

    网络设备和协议也可能限制单次传输的最大数据量。即使你的操作系统允许大数据传输,但是网络设备(如路由器、交换机)或者协议(如TCP)可能会限制每次传输的数据量。

    (3)内存限制:

    如果你一次性接收太多数据,可能会导致内存溢出,特别是在内存受限的系统上。

    因此,一般来说,你可以根据你的应用需求和系统限制来选择一个合适的 buffer_size。如果你不确定最合适的值是多少,可以使用一个相对较小的值,然后在实际应用中根据性能和可靠性进行调优。

    3、recv会阻塞流程么?

    是的,socket.recv(buffer_size) 是一个阻塞的操作,如果没有数据可接收,它会一直等待直到有数据到来。这种阻塞行为在默认情况下是的,如果你希望设置非阻塞模式,可以使用 setblocking(0) 方法。

    在非阻塞模式下,如果没有数据可接收,socket.recv(buffer_size) 会立即返回一个空字节串(b''),而不是等待数据到来。

    相关设置如下所示:

    1. sock = socket.socket()
    2. sock.setblocking(False)

    三、实战

    1. def tcp_client(server_ip, server_port, message):
    2. try:
    3. # 创建一个TCP套接字
    4. client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    5. # 连接服务器
    6. client_socket.connect((server_ip, server_port))
    7. # 发送数据到服务器
    8. client_socket.send(message.encode('utf-8'))
    9. # 接收从服务器返回的数据
    10. response = client_socket.recv(1024)
    11. print(response)
    12. # 关闭套接字连接
    13. client_socket.close()
    14. # 返回从服务器接收的响应
    15. return response.decode('utf-8')
    16. except Exception as e:
    17. return str(e)

  • 相关阅读:
    Linux应急响应学习
    Makefile三个版本的编写
    Golang 开发实战day04 - Standard Library
    SQL面试题
    引用——权限问题
    [架构之路-17]:目标系统 - 硬件平台 - ARM CPU架构与系列选型
    什么牌子的蓝牙耳机耐用?类似airpods pro的降噪耳机推荐
    从上半年智能驾驶前装量产数据看市场走势,你的机会在哪里?
    C++求欧拉角(eigen库中暴露的一些问题)
    出现线程不安全问题的原因及解决方法
  • 原文地址:https://blog.csdn.net/weixin_43431593/article/details/133902943