Python Socke

回射

SERVER

#!/usr/bin/python3
#_*_ coding:utf-8 _*_

import socket,os,time
import  socketserver
import time
import threading
import random
import sys
import socket
import getopt
import os
import re
import shutil
import platform

class ServerHandle(socketserver.BaseRequestHandler):

    def handle(self):

        conn = self.request
        conn.sendall(bytes("Hello I'm robot!",encoding="utf-8"))
        while True:
            ret_bytes = conn.recv(1024)
            ret_str = str(ret_bytes,encoding="utf-8")
            if ret_str == "q":
                break
            conn.sendall(bytes("You Send:" + ret_str,encoding="utf-8"))

def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
    pid = os.fork()
    if pid > 0:
        sys.exit(0)

    os.chdir("/")
    os.umask(0)
    os.setsid()

    pid = os.fork()
    if pid > 0:
        sys.exit(0)

    for f in sys.stdout, sys.stderr: f.flush()
    si = open(stdin, 'r')
    so = open(stdout, 'a+')
    #se = open(stderr, 'a+', 0)
    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdout.fileno())
    #os.dup2(se.fileno(), sys.stderr.fileno())



if __name__ == "__main__":
    daemonize('/dev/null', '/home/share/kitking/stdout.log', '/home/share/kitking/error.log')
    server = socketserver.ThreadingTCPServer(("192.168.199.XXX",6969),ServerHandle)
    server.serve_forever()

CLIENT

#!/usr/bin/python3
#_*_ coding:utf-8 _*_

import socket,os,time
import  socketserver

host = "XXX.eicp.net"
ip = socket.gethostbyname(host)
port = 6969

obj = socket.socket()
obj.connect((ip,port))

ret_bytes = obj.recv(1024)
ret_str = str(ret_bytes,encoding="utf-8")
print(ret_str)

while True:
    inp = input(">>")
    if inp == "q":
        obj.sendall(bytes(inp,encoding="utf-8"))
        break
    else:
        obj.sendall(bytes(inp, encoding="utf-8"))
        ret_bytes = obj.recv(1024)
        ret_str = str(ret_bytes,encoding="utf-8")
        print(ret_str)

SSH模拟

SERVER

import socket,os,time
server = socket.socket()
server.bind(('localhost',6969))
 
server.listen()
 
while True:
    print("beging waiting request...")
    conn,addr = server.accept()
    print("new conn:",addr)
    while True:
        print("request comming!",addr)
        data = conn.recv(1024)
        if not data:
            print("客户端已断开")
            break
        print("执行指令:",data)
        cmd = data.decode()
        cmd_res = os.popen(cmd).read()
        print("before send",len(cmd_res.encode('utf-8')))
        if len(cmd_res) == 0:
            com_res = "cmd has no output..."
        conn.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8'))
        #time.sleep(0.5)
        client_ack = conn.recv(1024) #wait client confirm
        conn.send(cmd_res.encode("utf-8"))
        print("send done")
server.close()

CLIENT

import socket
client = socket.socket()
client.connect(('localhost',6969))
 
while True:
    cmd = input(">>").strip()
    if len(cmd) == 0:continue
    client.send(cmd.encode("utf-8"))
    cmd_res_size = client.recv(1024)
    client.send(b"start_trans")
    sev_file_size = int(cmd_res_size.decode())
    #print('sev_file_size',sev_file_size,type(sev_file_size))
    received_size = 0
    received_data = b''
 
    while received_size < sev_file_size:
        data = client.recv(1024)
        #print("收到数据!")
        received_size += len(data)
        received_data += data
        #print('cli_file_size',received_data)
    else:
        #print("receive done...",received_size)
        print(received_data.decode())
 
client.close()

文件传送

SERVER

import socket,os,time,hashlib
server = socket.socket()
server.bind(('localhost',6969))
 
server.listen()
 
while True:
    print("beging waiting request...")
    conn,addr = server.accept()
    print("new conn:",addr)
    while True:
        print("request comming!",addr)
        data = conn.recv(1024)
        if not data:
            print("客户端已断开")
            break
        cmd,filename = data.decode().split()
        if os.path.isfile(filename):
            f = open(filename,'rb')
            m = hashlib.md5()
            file_size = os.stat(filename).st_size
            conn.send(str(file_size).encode('utf-8')) #send file size
            conn.recv(1024)  #wait for ack
            for line in f:
                m.update(line)
                conn.send(line)
            print("file md5",m.hexdigest())
            f.close()
            conn.send(m.hexdigest().encode())
 
 
        print("send done")
server.close()

CLIENT

import socket,hashlib
client = socket.socket()
client.connect(('localhost',6969))
 
while True:
    cmd = input(">>").strip()
    if len(cmd) == 0:continue
    if cmd.startswith('get'):
        client.send(cmd.encode('utf-8'))
        server_response = client.recv(1024)
        print('server response:',server_response)
        client.send(b'start to trans')
        file_total_size = int(server_response.decode())
        received_size = 0
        file_name = cmd.split()[1]
        f = open(file_name+".new",'wb')
        m = hashlib.md5()
        while received_size < file_total_size:
            if file_total_size - received_size >= 1024:
                size = 1024
            else:
                size = file_total_size - received_size
            data = client.recv(size)
            received_size += len(data)
            m.update(data)
            f.write(data)
            #print(file_total_size,received_size)
        else:
            new_file_md5 = m.hexdigest()
            print("file recv done",received_size,file_total_size)
            f.close()
        server_file_md5 = client.recv(1024)
        print("server file md5:",server_file_md5)
        print('client file md5:',new_file_md5)
 
 
 
client.close()

FTP模式

SERVER

import socket,hashlib
import socketserver,json,os
 
class MyTCPHandler(socketserver.BaseRequestHandler):
 
    def put(self,*args):
        cmd_dic = args[0]
        filename = cmd_dic['filename']
        filesize = cmd_dic['filesize']
        if os.path.isfile(filename):
            f = open(filename + ".new",'wb')
        else:
            f = open(filename,'wb')
        self.request.send(b'200,ok')
        recived_size = 0
        m = hashlib.md5()
        while recived_size < filesize:
            data = self.request.recv(1024)
            m.update(data)
            f.write(data)
            recived_size += len(data)
        else:
            f.close()
            print("file [%s] has uploaded..."%filename)
            recived_md5 = m.hexdigest()
            source_md5 = self.request.recv(1024).decode()
            if recived_md5 == source_md5:
                self.request.send('MD5校验成功'.encode('utf-8'))
            else:
                self.request.send('MD5校验失败'.encode('utf-8'))
 
 
 
 
 
    def handle(self):
        while True:
            try:
                print("开始监听!")
                self.data = self.request.recv(1024).strip()
                print("{} wrote:".format(self.client_address[0]))
                print(self.data)
                if not self.data:
                    print(self.client_address,"断开了!")
                    break
                cmd_dic = json.loads(self.data.decode())
                action = cmd_dic['action']
                if hasattr(self,action):
                    func = getattr(self,action)
                    func(cmd_dic)
 
 
 
 
            except ConnectionRefusedError as e:
                print(e)
                break
 
 
if __name__ == "__main__":
    HOST,PORT="localhost",9999
    server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
    server.serve_forever()

CLIENT

import socket
import os,json
import hashlib
 
 
 
class FtpClient(object):
    def __init__(self):
        self.client = socket.socket()
 
    def cmd_help(self,args):
        msg = '''
        ls
        pwd
        cd
        get filename
        put filename
        '''
        print(msg)
 
    def connect(self,ip,port):
        self.client.connect((ip,port))
 
    def interactive(self):
        self.auth()
        while True:
            cmd = input(">>").strip()
            if len(cmd) == 0:continue
            cmd_str = cmd.split()[0]
            if hasattr(self,'cmd_%s'%cmd_str):
                func = getattr(self,'cmd_%s'%cmd_str)
                func(cmd)
            else:
                self.help()
 
 
 
    def cmd_put(self,*args):
        cmd_split = args[0].split()
        if len(cmd_split) > 1:
            filename = cmd_split[1]
            os.path.isfile(filename)
            filesize = os.stat(filename).st_size
            msg_dic = {
                'action': 'put',
                'filename': filename,
                'filesize': filesize,
                'overridden': True
            }
            self.client.send(json.dumps(msg_dic).encode('utf-8'))
            server_response = self.client.recv(1024)
            f = open(filename,'rb')
            m = hashlib.md5()
            for line in f:
                m.update(line)
                self.client.send(line)
            else:
                print("file upload success...")
            f.close()
            self.client.send(m.hexdigest().encode())
            sev_md5_check = self.client.recv(1024)
            print(sev_md5_check.decode())
        else:
            print('file is not exist')
 
    def cmd_get(self):
        pass
 
 
    def auth(self):
        pass
 
 
 
class Account(object):
    def __init__(self):
        pass
 
 
 
ftp = FtpClient()
ftp.connect('localhost',9999)
ftp.interactive()

上传文件

import socket

sk = socket.socket()

sk.bind(("127.0.0.1",8080))
sk.listen(5)

while True:
    conn,address = sk.accept()
    conn.sendall(bytes("欢迎光临我爱我家",encoding="utf-8"))

    size = conn.recv(1024)
    size_str = str(size,encoding="utf-8")
    file_size = int(size_str)

    conn.sendall(bytes("开始传送", encoding="utf-8"))

    has_size = 0
    f = open("db_new.jpg","wb")
    while True:
        if file_size == has_size:
            break
        date = conn.recv(1024)
        f.write(date)
        has_size += len(date)

    f.close()

客户端

import socket
import os

obj = socket.socket()

obj.connect(("127.0.0.1",8080))

ret_bytes = obj.recv(1024)
ret_str = str(ret_bytes,encoding="utf-8")
print(ret_str)

size = os.stat("yan.jpg").st_size
obj.sendall(bytes(str(size),encoding="utf-8"))

obj.recv(1024)

with open("yan.jpg","rb") as f:
    for line in f:
        obj.sendall(line)
原文地址:https://www.cnblogs.com/jiangzhaowei/p/9269438.html