python网络编程--socket简单实现
admin
2023-07-21 01:02:18
0

python网络编程                                                                                                                                    

一、客户端控制服务端执行命令

server:

#!/usr/local/python3/bin/python3.6
#-*- coding:utf-8 -*-
#AUTH:FJC
from socket import *
from time import ctime
import subprocess
HOST = ''           #HOST变量空白,表示可以使用任何地址
PORT = 21567
BUFSIZ = 1024       #缓冲区大小为1KB
ADDR = (HOST,PORT)

tcp_ser_sock = socket(AF_INET,SOCK_STREAM)  #创建套接字对象,AF_INET表示面向网络的,SOCK_STREAM表示用于TCP传输的套接字类型
tcp_ser_sock.bind(ADDR)     #将地址(主机名、端口号对)绑定到套接字上
tcp_ser_sock.listen(5)  #设置并启动TCP 监听器,listen的参数表示连接被转接或拒绝之前,传入连接请求的最大数

while True:
    print('waiting for connecting...')
    tcp_cli_sock,addr = tcp_ser_sock.accept()   #返回一个socket对象和属于客户端的套接字
    print('...connect from:',addr)
    while True:
        try:
            data = str(tcp_cli_sock.recv(BUFSIZ),'utf8')
        except Exception:
            break
        if not data:
            continue
        obj = subprocess.Popen(data,shell=True,stdout=subprocess.PIPE)
        result = obj.stdout.read()
        tcp_cli_sock.send(bytes(str(len(result)),'utf8'))
        tcp_cli_sock.recv(BUFSIZ)   #解决粘包现象
        tcp_cli_sock.send(result)
    tcp_cli_sock.close()
tcp_ser_sock.close()

client:

#-*- coding:utf-8 -*-
#AUTH:FJC
from socket import *
from sys import exit
HOST = '127.0.0.1'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)

tcp_cli_sock = socket(AF_INET,SOCK_STREAM)
tcp_cli_sock.connect(ADDR)

while True:
    data = input('command>')
    if not data:
        continue
    elif data == ("exit" or "quit"):
        exit(1)
    tcp_cli_sock.send(bytes(data,'utf8'))
    result_len=str(tcp_cli_sock.recv(BUFSIZ),'utf8')
    tcp_cli_sock.send(bytes(1))
    result = bytes()
    while len(result) != int(result_len):
        data_rec = tcp_cli_sock.recv(BUFSIZ)
        result += data_rec
    print(str(result,'gbk'))
# tcp_cli_sock.close()

二、文件上传下载

server:

#-*- coding:utf-8 -*-
#AUTH:FJC
from socket import *
import os

HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcp_ser_sock = socket(AF_INET,SOCK_STREAM)
tcp_ser_sock.bind(ADDR)
tcp_ser_sock.listen(5)

BASE_DIR=os.path.dirname(os.path.abspath(__file__))

def upload():
    file_size = str(tcp_cli_sock.recv(BUFSIZ), 'utf8')
    file_size = int(file_size)
    file_recv = 0
    with open(path, 'ab') as f:
        while file_recv != file_size:
            data = tcp_cli_sock.recv(BUFSIZ)
            f.write(data)
            file_recv += len(data)
def download():
    file_size = os.stat(path).st_size
    tcp_cli_sock.send(bytes(str(file_size), 'utf8'))
    file_send = 0
    with open(path, 'rb') as f:
        while file_send != file_size:
            data = f.read(1024)
            tcp_cli_sock.send(data)
            file_send += len(data)
if __name__ == '__main__':
    while True:
        print('waiting for connecting...')
        tcp_cli_sock, addr = tcp_ser_sock.accept()
        print('...connect from:', addr)
        try:
            up_down_info = str(tcp_cli_sock.recv(BUFSIZ), 'utf8')
            cmd, path = up_down_info.split('|')
            filename = os.path.basename(path)
            path = os.path.join(BASE_DIR, 'server_dir', filename)
            if cmd == 'get':
                download()
            elif cmd == 'post':
                upload()
        except Exception:
            continue
    tcp_cli_sock.close()

client:

#-*- coding:utf-8 -*-
#AUTH:FJC
from socket import *
from sys import exit
import os

HOST = '127.0.0.1'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)

BASE_DIR=os.path.dirname(os.path.abspath(__file__))

def get():
    file_size = str(tcp_cli_sock.recv(BUFSIZ), 'utf8')
    print(type(file_size))
    file_size = int(file_size)
    file_recv = 0
    with open(path, 'ab') as f:
        while file_recv != file_size:
            data = tcp_cli_sock.recv(BUFSIZ)
            f.write(data)
            file_recv += len(data)
    print("文件下载成功!")
def post():
    file_size = os.stat(path).st_size
    tcp_cli_sock.send(bytes(str(file_size), 'utf8'))
    file_send = 0
    with open(path, 'rb') as f:
        while file_send != file_size:
            data = f.read(1024)
            tcp_cli_sock.send(data)
            file_send += len(data)
    print("文件上传成功!")

if __name__ == '__main__':
    while True:
        tcp_cli_sock = socket(AF_INET, SOCK_STREAM)
        tcp_cli_sock.connect(ADDR)
        command = input('(command|file)>')
        if not command:
            continue
        elif command == "exit" or command == "quit":
            exit(1)
        cmd,path = command.split('|')
        up_down_info = '%s|%s' % (cmd, path)
        filename = os.path.basename(path)
        tcp_cli_sock.send(bytes(up_down_info, 'utf8'))
        path = os.path.join(BASE_DIR, filename)
        if cmd == 'get':
            get()
        if cmd == 'post':
            post()
        tcp_cli_sock.close()


网络编程基础知识



相关内容

热门资讯

乌俄互指对方在赫尔松州发动袭击 乌克兰赫尔松州军事管理局20日在社交媒体发文称,截至当天早上6时,赫尔松州乌控区在过去24小时内遭俄...
伊朗外长将与巴基斯坦内政部长一... 当地时间20日,有消息显示,伊朗外长阿拉格齐20日晚将与巴基斯坦内政部长纳克维一同前往瑞士。伊朗外交...
文博日历丨早在8000年前 古... 端午假期各地特色龙舟活动轮番亮相其实,早在8000年前先民们就已经是有船一族了今天带你一起解锁“远古...
凤凰晚报丨35岁宝妈亲手勒死3... 今日人物【35岁宝妈亲手勒死3个娃,丈夫:不怪她】最近,美国马萨诸塞州一起震惊全美的“杀婴案”再次开...
被梅洛尼回怼后,特朗普怒发帖 美国总统特朗普声称意大利总理梅洛尼在G7峰会上央求与自己合影,梅洛尼正面回击,称这一说法“完全是捏造...
雨虹免砸砖防水靠谱吗 最佳回答 雨虹本身是一个非常知名的品牌,只要家里面的漏水问题不是特别严重,那使用雨虹免砸装防水还是非...
一桶乳胶漆能刷多少平方 乳胶漆... 乳胶漆是常用的墙面装饰材料,但很多人不知道一桶乳胶漆能刷多少平方。本文介绍了乳胶漆刷墙面积的计算方法...
旧房卫生间改造装修步骤(旧房如... 旧卫生间怎么翻新1、首先检查卫生间的瓷砖有没有破损现象,如果没有,只需要将瓷砖擦拭干净即可,如果瓷砖...
pvc扣板质量怎么区别?如何安... pvc扣板是家装中常用的吊顶材料,本文介绍了如何区别pvc扣板的质量以及安装pvc扣板吊顶的方法。 ...
电脑维修需要多少钱 电脑维修的费用因情况而异,主要取决于问题的严重程度、需要替换的零部件,以及维修服务的难度和时间。以下...