Python socket上传文件的服务端和客户端实现
发布日期:2021-05-07 21:44:58 浏览次数:21 分类:精选文章

本文共 4444 字,大约阅读时间需要 14 分钟。

socket编程入门及实践指南

socket编程是网络编程中最基础而又最重要的核心技术之一。本文将从基础概念出发,逐步介绍socket编程的实现方法,并提供实践案例。

socket编程基础

socket是计算机网络通信中的核心机制,它类似于内核中的信号门口,负责不同进程之间的通信。socket编程通常涉及客户端和服务器端的实现。

socket客户端

创建socket

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • socket.AF_INET:指定使用IPv4地址族。
  • socket.SOCK_STREAM:指定使用流式 socket(TCP)。

连接到服务器

s.connect(('127.0.0.1', 6666))

发送数据

s.send(b'Hello, World!')

接收数据

data = s.recv(1024)
print(data.decode())

关闭socket

s.close()

socket服务器端

服务器端的实现步骤如下:

创建socket

import socket
import threading
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1', 6666))
s.listen(10)

接收连接

conn, addr = s.accept()
print(f'Connected by {addr}')
t = threading.Thread(target=deal_data, args=(conn, addr))
t.start()

处理数据

def deal_data(conn, addr):
print(f'Accept new connection from {addr}')
conn.send(b'Hi, Welcome to the server!')
while True:
data = conn.recv(1024)
if not data:
break
print(f'{addr} client send data is {data.decode()}')
conn.send(b'Hello, {data.decode()}')
conn.close()

socket文件传输

文件传输是socket编程中的常见场景之一,通常分为以下几个步骤:

文件传输流程

  • 发送文件信息

    发送端首先发送文件的元信息,包括文件名和大小。

  • 发送文件内容

    按照发送的大小读取文件内容并逐块发送。

  • 接收文件

    接收端根据接收到的元信息准备接收空间,并将接收到的数据写入文件。

  • 发送端代码示例

    import socket
    import os
    import struct
    def socket_client():
    try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('127.0.0.1', 6666))
    except socket.error as msg:
    print(msg)
    sys.exit(1)
    print(s.recv(1024).decode())
    while True:
    filepath = input('please input file path: ')
    if os.path.isfile(filepath):
    fileinfo_size = struct.calcsize('128sl')
    fhead = struct.pack('128sl', os.path.basename(filepath), os.stat(filepath).st_size)
    s.send(fhead)
    print(f'client filepath: {filepath}')
    fp = open(filepath, 'rb')
    while True:
    data = fp.read(1024)
    if not data:
    print(f'{filepath} file send over...')
    break
    s.send(data)
    s.close()
    break
    else:
    print('invalid file path!')
    s.close()
    if __name__ == '__main__':
    socket_client()

    接收端代码示例

    import socket
    import threading
    import os
    import struct
    def socket_service():
    try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind(('127.0.0.1', 6666))
    s.listen(10)
    except socket.error as msg:
    print(msg)
    sys.exit(1)
    print('Waiting connection...')
    while True:
    conn, addr = s.accept()
    t = threading.Thread(target=deal_data, args=(conn, addr))
    t.start()
    def deal_data(conn, addr):
    print(f'Accept new connection from {addr}')
    conn.send(b'Hi, Welcome to the server!')
    while True:
    fileinfo_size = struct.calcsize('128sl')
    buf = conn.recv(fileinfo_size)
    if buf:
    filename, filesize = struct.unpack('128sl', buf)
    filename = filename.strip(b'\x00')
    new_filename = os.path.join('./', f'new_{filename}')
    print(f'file new name is {new_filename}, filesize: {filesize}')
    recvd_size = 0
    fp = open(new_filename, 'wb')
    print('start receiving...')
    while recvd_size < filesize:
    if (filesize - recvd_size) > 1024:
    data = conn.recv(1024)
    recvd_size += len(data)
    else:
    data = conn.recv(filesize - recvd_size)
    recvd_size = filesize
    fp.write(data)
    fp.close()
    print('end receive...')
    conn.close()
    break
    if __name__ == '__main__':
    socket_service()

    测试与验证

  • 在本地测试

    运行 service.py 后,打开两个终端窗口分别运行 client.py

  • 跨机器测试

    service.py 上传到目标服务器,修改服务端监听地址为目标服务器IP地址,客户端连接地址也修改为目标服务器IP地址。

  • 文件传输测试

    在发送端输入文件路径,系统会自动处理文件传输过程。

  • 工具推荐

    为了更高效地管理多个终端窗口,可以安装终端增强工具 Terminator

    • Ubuntu/Debian: sudo apt-get install terminator
    • CentOS: yum -y install terminator

    注意事项

    • 端口冲突

      如果服务端启动失败,可能是因为端口被占用。可以在服务端代码中添加 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 来避免端口冲突。

    • 网络环境

      确保客户端和服务器端位于同一网络中,且防火墙设置允许端口通信。

    • 异常处理

      在socket操作中,始终使用try-except块处理可能的异常,确保程序健壮性。

    通过以上内容,可以逐步掌握socket编程的基础知识,并通过实践案例提升编程能力。

    上一篇:Python socket构建简单的服务器客户端交互
    下一篇:Python根据程序名称结束进程

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年04月13日 23时26分41秒