zoukankan      html  css  js  c++  java
  • sock实现通讯(TCP)

    sock实现通讯(TCP)

    单次单用户通讯

    #server端
    import socket
    
    sk = socket.socket() #买手机
    sk.bind(("127.0.0.1",9000)) #绑定手机号,或者本机ip
    sk.listen()  #开机
    
    conn,addr = sk.accept() #等着接电话
    conn.send(b"hello")     #发送内容
    msg = conn.recv(1024) #所最大接受字符为1024
    print(msg)
    conn.close() #挂电话,连接关闭
    sk.close() #关机
    
    
    #clinet端
    import socket
    sk = socket.socket()
    sk.connect(("127.0.0.1",9000))
    
    msg = sk.recv(1024) #接受
    print(msg)          #呈现接受的内容
    sk.send(b"byebye")  #发送的 内容
    sk.close()
    

    socket(套接字)

    • 工作在应用层和传输层之间的抽象层
      • 帮助我们完成了所有信息的组织和拼接
    • sokcet对于程序员来说,已经是网络操作的底层

    多次单用户通讯

    #sever端
    import socket
    sk = socket.socket()
    sk.bind(("127.0.0.1",9000))
    sk.listen()
    print("*"*20)
    conn,addr = sk.accept() #阻塞
    while True:
        msg = conn.recv(1024).decode("utf-8")
        print(msg)
        if msg.upper() == "Q":break
        inp = input(">>>")
        conn.send(inp.encode("utf-8"))
        if inp.upper() == "Q":
            break
    conn.close()
    sk.close()
    
    #cilnet端
    import socket
    sk = socket.socket()
    sk.connect(("127.0.0.1",9000))
    while True:
        inp = input(">>>")
        sk.send(inp.encode("utf-8"))
        if inp.upper() == "Q":break
        msg = sk.recv(1024).decode("utf-8")
        if msg.upper() == "Q":break
        print(msg)
    sk.close()
    

    多次多用户通讯

    #sever端
    import socket
    sk = socket.socket()
    sk.bind(("127.0.0.1",9000))
    sk.listen()
    print("*"*20)
    while True:
        conn,addr = sk.accept() #阻塞
        while True:
            msg = conn.recv(1024).decode("utf-8")
            print(msg)
            if msg.upper() == "Q":break
            inp = input(">>>")
            conn.send(inp.encode("utf-8"))
            if inp.upper() == "Q":
                break
        conn.close()
    sk.close()
    
    #client1端
    import socket
    sk = socket.socket()
    sk.connect(("127.0.0.1",9000))
    while True:
        inp = input(">>>")
        sk.send(inp.encode("utf-8"))
        if inp.upper() == "Q":break
        msg = sk.recv(1024).decode("utf-8")
        if msg.upper() == "Q":break
        print(msg)
    sk.close()
    
    
    #client2端
    import socket
    sk = socket.socket()
    sk.connect(("127.0.0.1",9000))
    while True:
        inp = input(">>>")
        sk.send(inp.encode("utf-8"))
        if inp.upper() == "Q":break
        msg = sk.recv(1024).decode("utf-8")
        if msg.upper() == "Q":break
        print(msg)
    sk.close()
    

    带身份带颜色变换的无限多用户通讯

    #sever端
    import socket
    sk = socket.socket()
    sk.bind(("127.0.0.1",9000))
    sk.listen(5) #n允许多少客户端等待
    print("*"*20)
    while True:
        conn,addr = sk.accept() #阻塞
        while True:
            msg = conn.recv(1024).decode("utf-8")
            print("33[0;31m%s33[0m" % msg)
            if msg.upper() == "Q":break
            inp = input("服务器:")
            conn.send(("服务器:"+inp).encode("utf-8"))
            if inp.upper() == "Q":
                break
        conn.close()
    sk.close()
    
    #client1端
    import socket
    sk = socket.socket()
    sk.connect(("127.0.0.1",9000))
    while True:
        inp = input("小杨:")
        sk.send(("小杨:"+inp).encode("utf-8"))
        if inp.upper() == "Q":break
        msg = sk.recv(1024).decode("utf-8")
        if msg.upper() == "Q":break
        print("33[0;34m%s33[0m" % msg)
    sk.close()
    
    
    #client2端
    import socket
    sk = socket.socket()
    sk.connect(("127.0.0.1",9000))
    while True:
        inp = input("小李:")
        sk.send(("小李"+inp).encode("utf-8"))
        if inp.upper() == "Q":break
        msg = sk.recv(1024).decode("utf-8")
        if msg.upper() == "Q":break
        print(msg)
    sk.close()
    
    • TCP通讯练习

      #改变字体颜色,以及绑定识别用户的信息和昵称
      
      #server端
      import socket
      import json
      sk = socket.socket()
      sk.bind(("127.0.0.1",9000))
      sk.listen()
      color_dic = {
          "12345":{"color":"33[32m","name":"alex"},
          "12346":{"color":"33[32m","name":"wusir"},
          "12347":{"color":"33[32m","name":"xiaoyang"}
      }
      conn,_= sk.accept() #阻塞
      while True:
          msg = conn.recv(1024).decode("utf-8")
          dick_msg = json.loads(msg)
          uid = dick_msg["id"]
          if dick_msg["msg"].upper() == "Q":
              print("%s已经下线"%color_dic[uid]["color"])
          print('%s%s:%s33[0m'%(color_dic[uid]["color"],color_dic[uid]["name"],dick_msg["msg"]))
          inp = input(">>>")
          conn.send(inp.encode("utf-8"))
          if inp.upper() == "Q":
              print("你已断开与%s的聊天"%(color_dic[uid]["name"]))
              break
      conn.close()
      sk.close()
      
      #clinet端
      import socket
      import json
      sk = socket.socket()
      sk.connect(("127.0.0.1",9000))
      id = "12345"
      while True:
          inp = input(">>>")
          dic = {"msg":inp,"id":id}
          str_dic = json.dumps(dic)
          sk.send(str_dic.encode("utf-8"))
          if inp.upper() == "Q":
              print("你已断开和server的聊天")
          msg = sk.recv(1024).decode("utf-8")
          if msg.upper() == "Q":break
      
          print(msg)
      sk.close()
      

    基于TCP加密通讯处理

    #server端
    import json
    import socket
    import hashlib
    
    sk = socket.socket()
    sk.bind(("127.0.0.1",9000))
    sk.listen()
    
    def get_md5(username,password):
        md5 = hashlib.md5(username.encode("utf-8")) #动态加盐
        md5.update(password.encode("utf-8")) #哈希运算
        return md5.hexdigest()
    
    conn,_ = sk.accept()
    str_dic = conn.recv(1024).decode("utf-8")
    dic = json.loads(str_dic)
    with open("userinfo",encoding="utf-8")as f:
        for line in f:
            user, passwd = line.strip().split("|")
            if user == dic["usr"] and passwd == get_md5(dic["usr"],dic["pwd"]):
                res_dic = {"opt":"login","result":True}
                break
    
            else:
                res_dic = {"opt":"login","result":False}
    sdic = json.dumps(res_dic)
    conn.send(sdic.encode("utf-8"))
    conn.close()
    sk.close()
    
    #userinfo
    alex|431149301c8792c1ab4c40b783d37100 #经过哈希运算的密码
    
    
    
    #client端
    import socket
    import json
    
    user = input("username:")
    pwd = input("password:")
    dic = {"usr":user,"pwd":pwd}
    str_dic = json.dumps(dic)
    sk = socket.socket()
    sk.connect(("127.0.0.1",9000))
    
    sk.send(str_dic.encode("utf-8"))
    ret = sk.recv(1024).decode("utf-8")
    ret_dic = json.loads(ret)
    if ret_dic["result"]:
        print("登录成功")
    else:
        print("登录失败")
    
    sk.close()
    
    

    基于TCP文件传输

    #client端
    import socket
    import os
    import json
    sk = socket.socket()
    sk.connect(("127.0.0.1",9000))
    
    file_path = input(">>>")
    if os.path.isabs(file_path): #判断是否为绝对路径
       filename = os.path.basename(file_path) #获取文件名
       filesize = os.path.getsize(file_path) #获取文件的大小,为文件的接受做准备
       dic = {"filename":filename,"filesize":filesize} #向服务器传出文件的基本信息
       srt_dic = json.dumps(dic)
       sk.send(srt_dic.encode("utf-8"))
       with open(file_path,mode = "rb")as f:
           content = f.read()
           sk.send(content)
    
    sk.close()
    
    sk.close()
    
    
    #server端
    import socket
    import json
    
    sk = socket.socket()
    sk.bind(("127.0.0.1",9000))
    sk.listen()
    
    conn,_ = sk.accept()
    str_dic =conn.recv(1024).decode("utf-8")
    dic = json.loads(str_dic)
    content = conn.recv(dic["filesize"]) #按照文件的大小接受,由于TCP本身的缺陷,文件已损失部分
    with open(dic["filename"],mode="wb")as f: #在当前的路径下打开文件
       f.write(content)     #将接受到信息写入
    
    conn.close()
    sk.close()
    
    
    
    
    #补充:文件名的获取
    import os
    filename = r"C:UserslenovoDesktop医疗健康领域知识图谱的应用现状与挑战"#裸文件名的时候记得加r
    # print(filename)
    filename = os.path.basename(filename)
    print(filename)
    
    
    记录学习的点点滴滴
  • 相关阅读:
    将博客搬至CSDN
    JAVA代码备注
    清空数据库SQL
    实战ASP.NET访问共享文件夹(含详细操作步骤)
    我希望我知道的七个JavaScript技巧 译(转)
    ASP.NET获取客户端网卡使用的MAC地址信息
    JS中offsetTop、clientTop、scrollTop、offsetTop各属性介绍
    JS屏幕距离参数
    jQuery插件开发精品教程,让你的jQuery提升一个台阶
    jQuery编程的最佳实践
  • 原文地址:https://www.cnblogs.com/yangzilaing/p/14841487.html
Copyright © 2011-2022 走看看