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()
    
  • 相关阅读:
    eclipse如何与git 配合工作。
    git托管代码(二)
    PPC2003 安装 CFNET 3.5成功
    我的Window Mobile WCF 項目 第三篇 WM窗体设计
    我的Window Mobile WCF 項目 第一篇Mobile开发和WinForm开发的区别
    我的Window Mobile WCF 項目 第七天
    我的Window Mobile WCF 項目 第二篇 WindowsMobile访问WCF
    WCF 用vs2010 和 vs2008的简单对比测试
    vs2010beta1 和 搜狗输入法 冲突,按下 Ctrl 键就报错,重装搜狗解决
    我的Window Mobile WCF 項目 第六天 (二)
  • 原文地址:https://www.cnblogs.com/pythonwl/p/12739646.html
Copyright © 2011-2022 走看看