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客户端代码

  • 相关阅读:
    ....
    CodeForces 375A(同余)
    POJ 2377 Bad Cowtractors (最小生成树)
    POJ 1258 AgriNet (最小生成树)
    HDU 1016 Prime Ring Problem(全排列)
    HDU 4460 Friend Chains(bfs)
    POJ 2236 Wireless Network(并查集)
    POJ 2100 Graveyard Design(尺取)
    POJ 2110 Mountain Walking(二分/bfs)
    CodeForces 1059B Forgery(模拟)
  • 原文地址:https://www.cnblogs.com/GhostCatcg/p/8052763.html
Copyright © 2011-2022 走看看