python局域网通信_python实现同一局域网下传输图片

简述

Python可以通过网络套接字来进行传输图片

这点还是比较有意思的。

下面用TCP来进行实现,适用于Python3

代码功能简述

下面代码

实现了在一个电脑上发送图片(Sender)

实现了在另外一个电脑(也可以是同一个电脑上的不同端口)接受图片(Reciever)

只发一次,然后只收一次

新图片会在旧图片上多一个 “new_”前缀

必须要先开接受者代码才行,之后再启动发送者代码(不然发送者代码会直接被拒绝)

下面是固定了在一个电脑上(看ip地址,下面写的是127.0.0.1,如果是其他电脑就写其他电脑上的ip地址)

另外本程序只能在同一个局域网下使用(就算是广域网上,那就必须要使用广域网的ip地址)

代码

【后附解析】

Sender.py (发送者)

import socket

import os

import sys

import struct

def sock_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)

print(sys.exit(1))

while True:

filepath = input('input the file: ')

# filepath = 'test.png'

fhead = struct.pack(b'128sl', bytes(os.path.basename(filepath), encoding='utf-8'), os.stat(filepath).st_size)

s.send(fhead)

print('client filepath: {0}'.format(filepath))

fp = open(filepath, 'rb')

while 1:

data = fp.read(1024)

if not data:

print('{0} file send over...'.format(filepath))

break

s.send(data)

s.close()

break

if __name__ == '__main__':

sock_client()

Reciever.py (接受者)

import socket

import os

import sys

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("Wait")

while True:

sock, addr = s.accept()

deal_data(sock, addr)

break

s.close()

def deal_data(sock, addr):

print("Accept connection from {0}".format(addr))

while True:

fileinfo_size = struct.calcsize('128sl')

buf = sock.recv(fileinfo_size)

if buf:

filename, filesize = struct.unpack('128sl', buf)

fn = filename.decode().strip('x00')

new_filename = os.path.join('./', 'new_' + fn)

recvd_size = 0

fp = open(new_filename, 'wb')

while not recvd_size == filesize:

if filesize - recvd_size > 1024:

data = sock.recv(1024)

recvd_size += len(data)

else:

data = sock.recv(1024)

recvd_size = filesize

fp.write(data)

fp.close()

sock.close()

break

if __name__ == '__main__':

socket_service()

解析:

发送者代码:

还是先创建TCP套接字,并发起连接:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值