python scoket

服务端 

import os
import sys
import struct


def socket_service_image():

    try:
        s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
        # s.connect(('服务器的ip',6666))
        # 服务器和客户端在不同的系统或不同的主机下时使用的ip 和端口,首先要查看服务器所在的系统网卡的ip
        s.bind(('192.168.10.126',8989))
        #服务器和客户端都在一个系统下使用的ip和端口
        s.listen(10)
    except socket.error as msg:
        print(msg)
        sys.exit(1)
    print('Wait for Connection...........................')

    while True:
        sock,addr = s.accept()
        deal_image(sock,addr)


def deal_image(sock,addr):
    print('Accept connection from {0}'.format(addr))  # 查看发送端的ip和端口

    while True:
        fileinfo_size = struct.calcsize('128sq')
        buf = sock.recv(fileinfo_size)
        if buf:
            filename, filesize = struct.unpack('128sq',buf)
            fn = filename.decode().strip('\x00')
            new_filename = os.path.join('./','new_'+fn)
            # 在服务器端新建图片名 (可以不用新建的,直接用原来的也行,只要客
            recvd_szie = 0
            fp = open(new_filename,'wb')
            while not recvd_szie == filesize:
                if filesize - recvd_szie > 1024:
                    data = sock.recv(1024)
                    recvd_szie += len(data)
                else:
                    data = sock.recv(1024)
                    recvd_szie = filesize
                fp.write(data)
            fp.close()
        sock.close()
        break
socket创建一个套接字:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
bind绑定端口号:
s.bind(('192.168.10.126',8989))
listen(10)监听连接最大接收10个链接
s.listen(10)
exit()异常退出
sys.exit(1)
accept()生成一个scoket
sock,addr = s.accept()

deal_image(sock,addr)
os.path.getsize获取文件大小
sock.sendall(filesize.to_bytes(8, 'big'))
read(1024)读取文件数据
data = fp.read(1024)
send(data)发送数据
s.send(data)
open(filepath,'rb')新建文件
open(filepath,'wb')
close()关闭套接字
s.close()

客户端:

import socket
import os
import sys
import struct
def sock_client_image():
    while True:
        try:
            s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            # s.connect(('服务器的ip',6666))# 服务器和客户端在不同的系统或不同的主机下时使用的ip 和端口,首先要查看服务器所在的系统网卡的ip
            s.connect(('192.168.9.105',8989)) # 服务器和客户端都在一个系统下时使用的ip和端口
        except socket.error as msg:
            print(msg)
            print(sys.exit(1))
        filepath = input('input the file:') # 输入当前录下的图片名 xxx.jpg
        fhead = struct.pack(b'128sq',bytes(os.path.basename(filepath),encoding='utf-8'),
                            os.stat(filepath).st_size)# 将xxx.jpg以128sq的格式打包
        s.send(fhead)

        fp = open(filepath,'rb')# 打开要传输的图片
        while True:
            data = fp.read(1024)# 读入图片数据
            if not data:
                print('{0} send over...'.format(filepath))
                break
            s.send(data) # 以二进制的格式发送图片
        s.close()
        # break  # 循环发送


if __name__ == '__main__':
    sock_client_image()
fp = open(filepath,'rb')打开要发送的文件
fp = open(filepath,'rb')
read()读取文件
data = fp.read(1024)
s.send(data)以发送二进制形式发送
os.path.basename(filepath)获取文件名
os.path.basename(filepath)
os.stat(文件名).st_size获取文件大小
os.stat(filepath).st_size
struct.pack(b'128sq',encoding='utf-8')使用b'128sq'格式将文件名和文件打包为字符串
fhead = struct.pack(b'128sq',bytes(os.path.basename(filepath),encoding='utf-8'),
                            os.stat(filepath).st_size)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值