zoukankan      html  css  js  c++  java
  • socket 套接字

    socket套接字

    ​ socket是处于应用层与传输层之间的抽象层, 他是一组操作起来非常简单的接口(接受数据)此接口接受数据之后交由操作系统

    ​ 为什么存在socket抽象层?

    ​ 如果直接与操作系统数据交互非常麻烦, 繁琐, socket对这些繁琐的操作高度的封装, 简化

    ​ socket在python中就是一个模块

    基于TCP协议的socket简单通信

    客户端(cliend)

    import socket
    phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 默认基于TCP协议的socket
    phone.connect(("127.0.0.1", 8848))
    data = input("请输入")
    phone.send(date.encode("utf-8"))
    from_server_data = phone.recv(1024)
    print(f"来自服务端的消息:{from_server_data.decode('utf-8')}")
    phone.close()
    

    服务端(server)

    import socket
    phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 默认基于TCP协议的socket
    phone.bind(("192.168.14.198", 8848))
    phone.listen(5)
    print(111)
    conn,addr = phone.accept() # 阻塞
    print(conn, addr)
    from_client_data = conn.recv(1024)
    print(f"来自客户端{addr[0]的消息:{from_client_data.decode("utf-8")}")
    to_client_data = input(">>>")
    conn.send(to_client_data.encode("utf-8"))
    conn.close()
    phone.close()
    
    

    基于TCP协议的socket 链接+循环 通信

    server(服务器端)
    import socket
    phone = socket.socket()
    phone.bind(("172.0.0.1", 8848))
    phone.listen()
    while 1:
        conn, addr = phone.accept()
        print(conn, addr)
        while 1:
        	from_client_data = conn.recv(1024)
        	print(f"客户端传输进来的信息:{from_client_data.strip().decode('utf-8')}")
        	to_client_data = input("传给客户端的信息:")
        	conn.send(to_client_data)
        except ConnectionResetError:
            print("客户端中断")
            break
        conn.close()
    phone.close()
    
    client(客户端)
    import socket
    phone = socket.socket()
    phone.connect(("127.0.0.1", 8848))
    while 1:
        data = input("传向服务器端的信息:").strip().encode("utf-8")
        if not data:
            print("输入不得为空,会双向阻塞出bug")
            continue
        phone.send(data)
        if data.upper() == b"Q":
            print("退出成功")
            break
        from_server_data = phone.recv(1024)
        print(f"服务端传输进来的信息{from_server_data.strip().decode('utf-8')}")
    phone.close()
    

    基于TCP协议的socket通信 实例: 远程执行命令

    server(服务器端)
    import socket
    import subprocess
    phone = socket.socket()
    phone.bind(("172.0.0.1", 8848))
    phone.listen()
    while 1:
        conn, addr = phone.accept()
        print(conn, addr)
        while 1:
        	from_client_data = conn.recv(1024)
        	# print(f"客户端传输进来的信息:{from_client_data.strip().decode('utf-8')}")
            obj = subprocess.Popen(from_client_data.decode('utf-8'),
                     shell=True,
                     stdout=subprocess.PIPE.
                     stderr=subprocess.PIPE)
        	to_client_data = obj.stdout.read() + obj.stderr.read()
        	conn.send(to_client_data)
        except ConnectionResetError:
            print("客户端中断")
            break
        conn.close()
    phone.close()
    
    client(客户端)
    import socket
    phone = socket.socket()
    phone.connect(("127.0.0.1", 8848))
    while 1:
        data = input("传向服务器端的信息:").strip().encode("utf-8")
        if not data:
            print("输入不得为空,会双向阻塞出bug")
            continue
        phone.send(data)
        if data.upper() == b"Q":
            print("退出成功")
            break
        from_server_data = phone.recv(1024)
        print(f"服务端传输进来的信息{from_server_data.strip().decode('gbk')}")
    phone.close()
    
  • 相关阅读:
    Python学习笔记:List类型所有方法汇总
    Python学习笔记:String类型所有方法汇总
    制作“铜墙铁壁”一样的比特币冷钱包的完整流程详解!!
    jpa教程+ 常见的jpa报错以及解决方式
    Hibernate之mappedBy与@JoinColumn
    什么是JPA?Java Persistence API简介
    一文搞懂并发和并行
    清华大学操作系统【mark下】
    一文足以了解什么是 Java 中的锁.
    JDK8日常开发系列:Consumer详解
  • 原文地址:https://www.cnblogs.com/beichen123/p/11366208.html
Copyright © 2011-2022 走看看