[Python学习篇] Python Socket网络编程

Python中的socket编程是通过内置的socket模块实现的,可以方便地创建网络应用程序,包括客户端和服务器。

服务端

1. 创建套接字

使用socket.socket()函数创建一个TCP套接字。套接字可以是流式(TCP)或数据报式(UDP)

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

  • socket.AF_INET:表示使用IPv4地址。
  • socket.SOCK_STREAM:表示套接字类型为流式套接字,即TCP。

2. 绑定地址和端口

使用bind()方法将套接字绑定到特定的IP地址和端口号上,以便客户端能够连接到该地址和端口。IP可以不指定表示本机地址。

server_address = ('localhost', 8080)

server_socket.bind(server_address)

3. 监听连接请求

使用listen()方法开始监听客户端的连接请求。参数backlog指定等待连接的最大数量。当服务器忙于处理当前连接而不能立即处理新的连接请求时,这些新的连接请求将会被放入一个等待队列中,直到服务器有能力处理它们。backlog参数定义了这个等待队列的最大长度。

server_socket.listen(5) # 最多允许5个等待连接的请求

4. 接受客户端连接

使用accept()方法接受客户端的连接。该方法会阻塞程序,直到有客户端连接进来。一旦有连接,accept()方法返回一个新的套接字(client_socket)和客户端的地址信息(client_address)。

client_socket, client_address = server_socket.accept()

  • client_socket:是与客户端通信的新套接字。
  • client_address:是客户端的地址信息,通常是一个元组(IP地址, 端口号)。

5. 与客户端通信

使用返回的client_socket对象与客户端进行数据交换。可以使用recv()方法接收客户端发送的数据,recv方法会阻塞直到接收到数据,并使用sendall()方法发送响应给客户端。

data = client_socket.recv(1024) # 接收数据,指定缓冲区大小为1024字节

client_socket.sendall(data) # 发送响应数据给客户端

6. 关闭连接

当通信结束后,使用close()方法关闭客户端套接字和服务器套接字,释放资源。

server_socket.close() # 关闭服务器套接字

TCP socket服务器代码

示例:

python 复制代码
import socket
import threading

# 服务器地址和端口
SERVER_HOST = 'localhost'
SERVER_PORT = 12345


def handle_client(client_socket):
    try:
        # 接收客户端的数据
        data = client_socket.recv(1024)
        print(f'收到客户端消息: {data.decode()}')  # decode:把字节数据转换成字符串数据

        # 发送响应给客户端
        message = 'Hello 我是服务端!'
        client_socket.sendall(message.encode())  # encode:把字符串数据转换成字节数据
    except Exception as e:
        print(f'处理客户端连接时出错: {e}')
    finally:
        # 关闭客户端连接
        client_socket.close()


def start_server():
    # 创建TCP套接字
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口复用选项
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    try:
        # 绑定服务器地址和端口
        server_socket.bind((SERVER_HOST, SERVER_PORT))

        # 开始监听连接
        server_socket.listen(128)
        print(f'服务器启动,监听 {SERVER_HOST}:{SERVER_PORT}')

        while True:
            # 等待客户端连接
            client_socket, client_address = server_socket.accept()
            print(f'接受来自 {client_address} 的连接')

            # 使用线程处理客户端请求
            client_thread = threading.Thread(target=handle_client, args=(client_socket,))
            client_thread.start()

    except Exception as e:
        print(f'服务器启动失败: {e}')
    finally:
        # 关闭服务器套接字
        server_socket.close()


if __name__ == "__main__":
    start_server()

客户端

1. 创建套接字

使用socket.socket()函数创建一个TCP套接字。

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

  • socket.AF_INET:表示使用IPv4地址。
  • socket.SOCK_STREAM:表示套接字类型为流式套接字,即TCP。

2. 连接到服务器

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

server_address = ('localhost', 12345) # 服务器地址和端口

client_socket.connect(server_address)

3. 发送数据

使用sendall()方法将数据发送到服务器。该方法确保数据被完整发送。

message = '我是客户端数据!'

client_socket.sendall(message.encode())

4. 接收数据

使用recv()方法从服务器接收数据,该方法会阻塞直到收到数据。参数指定接收缓冲区的大小。

data = client_socket.recv(1024)

print(f'收到服务器消息: {data.decode()}')

5. 关闭连接

使用close()方法关闭套接字,释放资源。

client_socket.close()

TCP socket客户端代码

示例:

python 复制代码
# client.py
import socket

# 服务器地址和端口
SERVER_HOST = 'localhost'
SERVER_PORT = 12345


def start_client():
    try:
        # 1. 创建TCP套接字
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # 2. 连接服务器
        client_socket.connect((SERVER_HOST, SERVER_PORT))
        print(f'已连接到服务器 {SERVER_HOST}:{SERVER_PORT}')

        # 3. 发送数据给服务器
        message = 'Hello 我是客户端!'
        client_socket.sendall(message.encode())  # encode:把字符串数据转换成字节数据

        # 4. 接收服务器的响应
        data = client_socket.recv(1024)
        print(f'收到服务器消息: {data.decode()}')  # decode:把字节数据转换成字符串数据

    except Exception as e:
        print(f'客户端出错: {e}')
    finally:
        # 5. 关闭客户端套接字
        client_socket.close()


if __name__ == "__main__":
    start_client()

客户端不断开,接收用户输入信息发送到服务端

示例:

服务端代码

python 复制代码
# server.py
import socket
import threading

# 服务器地址和端口
SERVER_HOST = 'localhost'
SERVER_PORT = 12345


def handle_client(client_socket):
    try:
        while True:
            # 接收客户端的数据
            data = client_socket.recv(1024)
            if not data:
                break
            print(f'收到客户端消息: {data.decode()}')

            # 发送响应给客户端
            message = 'Echo: ' + data.decode()
            client_socket.sendall(message.encode())
    except Exception as e:
        print(f'处理客户端连接时出错: {e}')
    finally:
        # 关闭客户端连接
        client_socket.close()


def start_server():
    # 创建TCP套接字
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    try:
        # 绑定服务器地址和端口
        server_socket.bind((SERVER_HOST, SERVER_PORT))

        # 开始监听连接,请求等待队列的最大长度设置为128
        server_socket.listen(128)
        print(f'服务器启动,监听 {SERVER_HOST}:{SERVER_PORT} ...')

        while True:
            # 等待客户端连接
            client_socket, client_address = server_socket.accept()
            print(f'接受来自 {client_address} 的连接')

            # 使用线程处理客户端请求
            client_thread = threading.Thread(target=handle_client, args=(client_socket,))
            client_thread.start()

    except Exception as e:
        print(f'服务器启动失败: {e}')
    finally:
        # 关闭服务器套接字
        server_socket.close()


if __name__ == "__main__":
    start_server()

客户端代码

python 复制代码
# client.py
import socket

# 服务器地址和端口
SERVER_HOST = 'localhost'
SERVER_PORT = 12345


def start_client():
    try:
        # 创建TCP套接字
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # 连接服务器
        client_socket.connect((SERVER_HOST, SERVER_PORT))
        print(f'已连接到服务器 {SERVER_HOST}:{SERVER_PORT}')

        while True:
            # 从用户获取输入
            message = input('请输入发送给服务器的消息: ')

            # 发送数据到服务器
            client_socket.sendall(message.encode())

            # 接收服务器的响应
            data = client_socket.recv(1024)
            print(f'收到服务器消息: {data.decode()}')

    except Exception as e:
        print(f'客户端出错: {e}')
    finally:
        # 关闭客户端套接字
        client_socket.close()


if __name__ == "__main__":
    start_client()
相关推荐
Kai HVZ24 分钟前
python爬虫----爬取视频实战
爬虫·python·音视频
古希腊掌管学习的神27 分钟前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
m0_7482448329 分钟前
StarRocks 排查单副本表
大数据·数据库·python
B站计算机毕业设计超人36 分钟前
计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
大数据·人工智能·爬虫·python·机器学习·课程设计·数据可视化
路人甲ing..39 分钟前
jupyter切换内核方法配置问题总结
chrome·python·jupyter
游客5201 小时前
opencv中的常用的100个API
图像处理·人工智能·python·opencv·计算机视觉
每天都要学信号1 小时前
Python(第一天)
开发语言·python
凡人的AI工具箱1 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite
咸鱼桨2 小时前
《庐山派从入门到...》PWM板载蜂鸣器
人工智能·windows·python·k230·庐山派
北京_宏哥2 小时前
python接口自动化(四十)- logger 日志 - 下(超详解)
python·前端框架·自动化运维