zoukankan      html  css  js  c++  java
  • socket 网络编程笔记 一

    初始socket模块

    Serve端代码

    
    
    import socket
    
    sk = socket.socket() #默认为TCP连接
    """socket 里面两个方法
    family=AF_INET:服务器之间的通信
    family=AF_UNIX:Unix不同进程间的通信
    
    SOCK_STREAM: TCP连接
    SOCK_DGRAM:UDP连接
    
    """
    address =("127.0.0.1", 8000)#IP地址和端口号(端口号1024以后随便用)
    sk.bind(address)#绑定IP地址和端口号
    sk.listen(3)#3个连接等待,多的连接不上
    conn, addr = sk.accept() #返回连接的对象,和address 连接对象的IP和端口号
    #conn 是客户端的conn 最重要最关键的参数
    
    """
    recv()接收
    send()发送
    sendall()全发送,使劲发
    """
    inp = input(">>>")
    conn.send(bytes(inp,"utf8"))#3.x之后的版本都是默认发送beytes类型
    #所以要按照utf8的格式转换成beytes在发送
    
    
    
    




    Client客户端代码
    import socket
    
    sk = socket.socket()
    
    address =("127.0.0.1", 8000) #准备连接的IP和端口号
    
    sk.connect(address)#建立连接,里面输入IP和端口号
    
    data = sk.recv(1024)#接收数据多少,这里的概念有点模糊。。。
    
    print(str(data,"utf8"))#接收过来的数据也要通过uft8格式转换成str
    

    无限制聊天代码更新

    Serve端代码

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    import socket
    
    sk = socket.socket()#创建网络
    address = ("192.168.10.197", 8000)#IP和端口
    sk.bind(address)#绑定IP和端口
    sk.listen(3)#等待中的进程
    
    while 1 :
        print("等待连接...........")
        conn, addr = sk.accept()#返回连接的信息
        print("有一个连接成功")
        while 1:
            try:
                data = conn.recv(1024)
            except:
                print("目标强制退出,已经断开连接")
                break
            if not data: print("目标已退出");break
            print(str(data, "utf8"))
            inp = input("请输入你要发送的内容:")
            conn.send(bytes(inp, "utf8"))#发送

    Client客户端代码

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    import socket
    
    sk = socket.socket()
    
    address = ("192.168.10.197", 8000)
    sk.connect(address)
    while 1:
        inp = input("请输入你要发送的内容:")
        if not inp:
            print("请不要输入空内容!")
            inp = input("请输入你要发送的内容:")
        elif inp == "退出":
            break
        sk.send(bytes(inp, "utf8"))
        data = sk.recv(1024)
        print(str(data, "utf8"))

     

    远程执行代码

    Serve端代码

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    import socket
    import subprocess #还没学过,找之前视频教程学习
    sk = socket.socket()#创建网络
    address = ("192.168.10.197", 8000)#IP和端口
    sk.bind(address)#绑定IP和端口
    sk.listen(3)#等待中的进程
    while 1:
        print("等待连接...........")
        conn, addr = sk.accept()#返回连接的信息
        print("有一个连接成功")
        while 1:
            try:
                data = conn.recv(1024)
            except:
                print("目标强制退出,已经断开连接")
                break
            if not data: print("目标已退出"); break
            #远程执行命令
            obj = subprocess.Popen(str(data, "utf8"), shell=True, stdout=subprocess.PIPE)#加上stdout把这个变成子程序对象赋予给obj,传入数据要是utf8
            cmd_result = obj.stdout.read()#运行之前传入的命令
            result_len = bytes(str(len(cmd_result)), "utf8")#把得到的数据len保存变量先传过去
    
            #内容太大,一次性发布送不完
            #通过len大小来判断是否接收完毕
            conn.sendall(result_len)#发送数据大小
            """黏包现象,会把下面的黏带过去"""
            conn.recv(1024)
            """以上是解决方法"""
            conn.sendall(cmd_result)#发送cmd执行后的内容

    Client客户端代码

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    import socket
    sk = socket.socket()
    address = ("192.168.10.197", 8000)
    sk.connect(address)
    
    while 1:
        inp = input("请输入你要发送的内容:")
        if not inp:
            print("请不要输入空内容!")
            inp = input("请输入你要发送的内容:")
        elif inp == "退出":
            break
    
        sk.send(bytes(inp, "utf8"))#发送过去一个命令
    
        result_len = int(str(sk.recv(1024), "utf8"))#从接收过来的bytes类型转换成int
    
        sk.sendall("ok")#解决黏包问题
    
        data = bytes()#创建一个空的bytes类型
    
        while result_len != len(data):#判断接收过来的数据大小是否等于发送的数据大小
            recv = sk.recv(1024)
            data += recv
    
        print(str(data, "gbk"))

     

    上传文件代码

    Serve端代码

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    import socket
    import os
    import subprocess #还没学过,找之前视频教程学习
    sk = socket.socket()#创建网络
    address = ("192.168.10.197", 8000)#IP和端口
    sk.bind(address)#绑定IP和端口
    sk.listen(3)#等待中的进程
    
    BASE_DIR = os.path.dirname(os.path.abspath(__file__)) #求出绝对路径
    
    while 1:
        print("等待连接...........")
        conn, addr = sk.accept()
        while 1:
        #返回连接的信息
            print("有一个连接成功")
            #接收上传文件
            info_recv = conn.recv(1024)#接收第一个包装信息
            info_recv = str(info_recv,"utf8")
            filename, filesize = info_recv.split("|")#解析包装信息
            filesize = int(filesize)#把字符串的filesize转换成int整数型
            path = os.path.join(BASE_DIR, "serve", filename)#要输入的文件路径和文件名拼接
            with open(path, "wb") as f:
                info_size = 0
                while info_size != filesize:#判断接收文件大小是否符合
                    print("正在接收...")
                    data = conn.recv(1024)
                    f.write(data)
                    info_size += len(data)

    Client客户端代码

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    import socket
    import os
    
    sk = socket.socket()
    address = ("192.168.10.197", 8000)
    sk.connect(address)#连接
    
    BASE_DIR = os.path.dirname(os.path.abspath(__file__)) #求出绝对路径
    
    while 1:
        inp = input("请输入你要发送的内容:").strip()#post上传命令|文件名,去掉换行符等一切空格
        #自己用就不进行判断输入是否合法了
        cmd, filename = inp.split("|")#解析文件的命令和文件名
        print(cmd, filename)
        path = os.path.join(BASE_DIR, filename)#绝对路径加上文件名
        filesize = os.stat(path).st_size #求出文件大小
        print(filesize)
        info_file = "%s|%s"%(filename,filesize)#包装两个信息到一起(文件名+文件大小)发送过去
        sk.sendall(bytes(info_file, "utf8"))#发送
        info_size = 0#定义一个空变量
        with open(path, "rb") as f:#读取文件
            while info_size != filesize:#循环发送
                print("正在发送")
                data = f.read(1024)#每次读取1024字节
                sk.sendall(data)#发送文件
                info_size += len(data)#累加文件大小
        print("恭喜您,上传完成!")

    Serve端代码

    Client客户端代码

  • 相关阅读:
    python3 简单爬虫
    springmvc的一个错误
    全栈技术经理——产品管理:产品管理那些事01
    全栈技术经理——团队管理:每周问问你的团队这这些问题 V1.0
    全栈技术经理——自我管理:读《有效管理的五大兵法》有感
    全栈技术经理——团队管理:指导中层管理者日常行动指南
    【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)
    CentOS7环境下SSH端口修改笔记
    CentOS7下挂载硬盘笔记
    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现3
  • 原文地址:https://www.cnblogs.com/GhostCatcg/p/8052763.html
Copyright © 2011-2022 走看看