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

    socket
    首先,是干什么的

    socket 是应用层与tcp/ip等层的中间层,它是一个抽象层,将各种协议封装起来,用socket调用就好了。
    import socket
    在应用层中,使用这个socket实现数据的传输。

    应用:
    TCP:

    服务端:

    import socket
    
    # 1、买手机
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议
    
    # 2、绑定手机卡
    phone.bind(('127.0.0.1',8083)) # 0-65535, 1024以前的都被系统保留使用
    
    # 3、开机
    phone.listen(5) # 5指的是半连接池的大小
    print('服务端启动完成,监听地址为:%s:%s' %('127.0.0.1',8080))
    
    # 4、等待电话连接请求:拿到电话连接conn
    conn,client_addr=phone.accept()
    
    # 5、通信:收发消息
    while True:
        try:
            data=conn.recv(1024) # 最大接收的数据量为1024Bytes,收到的是bytes类型
            if len(data) == 0:
                # 在unix系统洗,一旦data收到的是空
                # 意味着是一种异常的行为:客户度非法断开了链接
                break
            print("客户端发来的消息:",data.decode('utf-8'))
            conn.send(data.upper())
        except Exception:
            # 针对windows系统
            break
    
    # 6、关闭电话连接conn(必选的回收资源的操作)
    conn.close()
    
    # 7、关机(可选操作)
    phone.close()
    

    客户端:

    import socket
    
    #1、买手机
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议
    
    #2、拨通服务端电话
    phone.connect(('127.0.0.1',8083))
    
    #3、通信
    while True:
        msg=input("输入要发送的消息>>>: ").strip() #msg=''
        if len(msg) == 0:continue
        phone.send(msg.encode('utf-8'))
        print('======?')
        data=phone.recv(1024)
        print(data.decode('utf-8'))
    
    #4、关闭连接(必选的回收资源的操作)
    phone.close()
    

    注意:

    传输的数据时 bytes 类型。
    os.system()  执行系统命令:返回值:0:正确命令 1:错误命令  int 不能encode
    os.system 命令不存在,不会报错。
    

    tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端
    udp是无链接的,先启动哪一端都不会报错

    TCP实现远程执行系统命令:

    实现远程执行系统命令
    服务端:

    import socket
    import os
    
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    s.bind(('127.0.0.1',8080))
    s.listen(5)
    
    data_coun,addr = s.accept()
    print(data_coun)
    while True:
        try:
            data1 = data_coun.recv(1024)
            if not data1:break
            print(data1.decode('utf-8'))
    
            result = os.system(data1.decode('utf-8'))
            if not result:
                data_coun.send('命令已执行'.encode('utf-8'))
            if result:
                data_coun.send('no cmd'.encode('utf-8'))
    
        except Exception:
            print('服务端:客户端断开了')
            break
    data_coun.close()
    
    

    客户端:

    import socket
    
    c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    print(c)
    c.connect(('127.0.0.1',8080))
    print(c)
    while True:
        cmd = input('请输入命令:').strip()
        if not cmd:continue
        if cmd == 'q':break
        c.send(cmd.encode('utf-8'))
        data = c.recv(1024)
        print(data.decode('utf-8'))
    
    c.close()
    

    UDP实现远程执行系统命令:
    服务端:

    import socket
    import os
    
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    s.bind(('127.0.0.1',8080))
    while True:
        # try:
            data1,addr = s.recvfrom(1024)
            print(data1,addr)
            if not data1:break
            print(data1.decode('utf-8'))
            result = os.system(data1.decode('utf-8'))
            if not result:  #os.system 命令不存在,不会报错。
                s.sendto('命令已执行'.encode('utf-8'),addr)
            else:
                s.sendto('no cmd'.encode('utf-8'),addr)
        # 甚至这个判断客户端是否断开的try,也是没有必要的,因为没有连接,不看客户端和服务端的启动顺序
        # except Exception:
        #     print('服务端:客户端断开了')
        #     break
    
    

    客户端:

    import socket
    
    c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    while True:
        cmd = input('请输入命令:').strip()
        # if not cmd:continue
        if cmd == 'q':break
        c.sendto(cmd.encode('utf-8'),('127.0.0.1',8080))
        data,addr = c.recvfrom(1024)
        print(data,addr)
        print(data.decode('utf-8'))
    
    c.close()
    
  • 相关阅读:
    Html代码查看器
    Http请求
    HTTP协议
    AsyncTask2
    AsyncTask
    幽灵线程解决方案
    handler消息机制入门
    多叉树的树形背包常见建模方法
    Codeforces Round #263
    怎样在win7下装ubuntu(硬盘版安装)
  • 原文地址:https://www.cnblogs.com/pythonwl/p/12739646.html
Copyright © 2011-2022 走看看