socket

初识socket,下面是的进行简单操作

#############################################################################

模拟对话

serve.py

#!/usr/bin/python
# -*- coding:utf-8 -*- 
"""
@author: ‘FMspider‘
@time: 2018-5-2 7:46
@function: 服务端
"""
import socket
# 创建实例
sk = socket.socket()
# 绑定服务端本机地址
adderss = ('127.0.0.1', 8000)
sk.bind(adderss)
#设置客户端请求数量(最大排队数)
sk.listen(3)

print('waiting...')
while 1:        # 等待下一个用户接连
    conn,addr = sk.accept()
    while 1:    # 不间断的聊天
        try:    # 异常处理,处理客户直接中断客户端
            data = conn.recv(1024)  # 一收
        except Exception:
            break
        print(str(data,'utf8'))
        if not data:break
        inp = input(':::') # 一发
        conn.send(bytes(inp,'utf8'))







client.py

#!/usr/bin/python
# -*- coding:utf-8 -*- 
"""
@author: ‘FMspider‘
@time: 2018-5-2 7:46
@function: 客户端
"""

import socket
# 创建实例
sk = socket.socket()
# 绑定要连接的服务端地址
address = ('127.0.0.1', 8000)
sk.connect(address)
while 1:
    #输入并发送数据
    inp = input('>>>')
    if inp == 'q':              # 退出条件判断
        break
    sk.send(bytes(inp, 'utf8')) # 一发
    #接收数据并打印
    data = sk.recv(1024)        # 一收
    print(str(data,'utf8'))

sk.close()  # 关闭接连


#############################################################################

远程执行命令(在本机)

cmd_serve.py

#!/usr/bin/python
# -*- coding:utf-8 -*- 
"""
@author: ‘FMspider‘
@time: 2018-5-2 8:43
@function: 远程执行命令_服务端
"""
import socket
import subprocess

sk = socket.socket()
adderss = ('127.0.0.1', 9000)
sk.bind(adderss)

sk.listen(3)

print('waiting...')
while 1:        # 等待下一个用户接连
    conn,addr = sk.accept()
    while 1:    # 不间断的聊天
        try:    # 异常处理,处理客户直接中断客户端
            data = conn.recv(1024)  # 一收
        except Exception:
            break
        if not data: break

        # 命令行操作
        obj = subprocess.Popen(str(data,'utf8'), shell=True, stdout=subprocess.PIPE)
        cmd_result = obj.stdout.read()

        result_len = bytes(str(len(cmd_result)),'utf8') # 获取命令长度并换bytes类型
        conn.send(result_len)   # 向客户端发送长度
        conn.recv(1024)     # 解决粘包问题
        conn.sendall(cmd_result) # 发送命令内容

cmd_client.py

#!/usr/bin/python
# -*- coding:utf-8 -*- 
"""
@author: ‘FMspider‘
@time: 2018-5-2 8:43
@function: 远程执行命令_客户端
"""
import socket
# 创建实例
sk = socket.socket()
# 绑定要连接的服务端地址
address = ('127.0.0.1', 9000)
sk.connect(address)
while 1:
    #输入并发送数据
    inp = input('>>>')
    if inp == 'q':              # 退出条件判断
        break
    sk.send(bytes(inp, 'utf8')) # 一发
    result_len = sk.recv(1024)  # 粘包
    sk.send(bytes(' ', 'utf8'))
    # print(result_len)
    cmd = bytes()
    while bytes(str(len(cmd)),'utf8') != result_len:    # 循环接收数据
        # print(len(cmd))
        # print(result_len)
        #接收数据并打印
        data = sk.recv(1024)        # 一收
        cmd += data
    print(str(cmd, 'gbk'))

sk.close()  # 关闭接连

#############################################################################

模拟文件上传

post_serve.py

# !/usr/bin/python
# -*- coding:utf-8 -*- 
# ++++++++++++++++++++
# author: FMspider
# time: 2018-5-2 11:03
# function: 上传文件_serve
import os
import socket

sk = socket.socket()

adderss = ('127.0.0.1', 8000)
sk.bind(adderss)

sk.listen(3)

print('waiting.....')
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

while 1:
    conn, addr = sk.accept()
    while 1:
        data = conn.recv(1024)
        cmd, filemame, filesize = str(data,'utf8').split('|')   #一收
        path = os.path.join(BASE_DIR,'images',filemame)  # 要保存的绝对路径
        filesize = int(filesize)    # 换int类型

        f = open(path,'ab') # 打开文件,写入
        has_receive = 0
        while has_receive != filesize:
            data = conn.recv(1024)
            f.write(data)
            has_receive += len(data)
        f.close()




post_client.py

# !/usr/bin/python
# -*- coding:utf-8 -*- 
# ++++++++++++++++++++
# author: FMspider
# time: 2018-5-2 11:04
# function: 上传文件_client
import os
import socket

sk = socket.socket()

adderss = ('127.0.0.1', 8000)
sk.connect(adderss)

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

while True:
    inp = input('>>>').strip()   # post|img.png

    cmd, path = inp.split('|')

    path = os.path.join(BASE_DIR, path) # 获取文件路径

    filename = os.path.basename(path)   # 获取文件名

    file_size = os.stat(path).st_size  #获取文件大小

    file_info = 'post|%s|%s' %(filename, file_size)

    sk.sendall(bytes(file_info,'utf8'))   #一发

    f = open(path,'rb')

    has_sent = 0
    while has_sent != file_size:
        data = f.read(1024)
        sk.sendall(data)
        has_sent += len(data)

    f.close()
    print('上传成功!')



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值