zoukankan      html  css  js  c++  java
  • 网络编程socket

    网络编程套接字socket的使用方法

    1. 使用socket.AF_INET获取网络地址,  socket.SOCK_STREAM获取流数据

    判断IP端口是否被占用:  

    2. socket.SOL_SOCKET   和  socket.SO_REUSEADDR 帮助判断, 有加一, 参数放在最后

    3. 绑定IP地址给接受变量  bind (127.0.0.1)  本机调试地址, 当然在开发中不会使用固定地址, 这里只是为方便调试

    4. 使用    listen(n)    监听客户端发来的请求个数n  一般设置为5个, 这里是设置打电话, 如果是高并发则另算

    5. accept  用来接收客户端发来的消息,  一般发来的消息分为两段, 一段是记录传进来的内容, 一段时间记录传进来的IP地址, 我们只需要记录内容

    6. recv(n)是用来接收最大字节数 byte(n ) 个字节

    7. send 发送出传进来  进行操作后的值, 发送到传入的地址上, 谁发来的就送回给谁

    8. close  关闭传输

    这里写一个完整的服务端接收器,  并对传进来的数据进行大写处理

    传输只能是byte类型, 都是底层传输
    import socket
    import subprocess
    # 产生载体
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 防止IP端口冲突
    phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    # IP绑定
    phone.bind(('127.0.0.1',8081))
    
    phone.listen(5)  # 5 代表最大挂起数
    conn,clinet_addr = phone.accept()   将传进来的值进行分离
    
    data = conn.recv(1024)   # 最大接收byte给
                
    conn.send(data.upper)  # 加号是一个可以优化的点
            
    conn.close()
    
    phone.close()

    客户端  简单的输入一次就结束

    import socket
    
    # 产生载体
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 连接
    phone.connect(('127.0.0.1',8081))
    
    # 发,收信息
    cnd = input(">>")
    
    phone.send(cnd.encode('utf-8'))
    data = phone.recv(1024)
    print(data.decode('utf-8'))  # win系统需要改成   ''  gbk  ''
     
    phone.close()

    这样做似乎不太简洁,,如果想要多次输入, 那么就需要改进了

    改进一;

     解决问题1

    如何多次接收并返回给客户端, 

    举例: 在一个餐厅, 有一个招待员, 和一个服务员, 当招待员招待完成后就是服务员招待了, 服务员每次只能接待一个客人,多余的要在

    招待员中等待, 一个个的解决问题, , 这样可以解决多用户访问,   这里要使用  try  采集错误, 因为每个客户端停止访问时, 服务端还会

    继续监听, 当服务端监听不到地址时会报错,  当监听到错误时立即停止对这个 "人" 的招待, 进行下一个处理.

    问题2   当输入为空格时, eccept 不会对空字符进行处理, 空类型转换不了>> byte类型, 导致系统中无法编码发送, 这样就停留在客户端

    没有发送出去, 客户端也不能再接收数据, 导致客户端崩盘

    解决代码如下: 

    服务端


    import
    socket import subprocess # 产生载体 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # IP绑定 phone.bind(('127.0.0.1',8081))

    接收用户个数
    while True: phone.listen(5) # 5 代表最大挂起数 conn,clinet_addr = phone.accept()
      处理用户问题
    while True:
        当客户端断开连接时铺抓错误进行终止对服务
    try: data = conn.recv(1024) # 处理空 if not data:break conn.send(daga.upper()) except ConnectionResetError: break conn.close() phone.close()

    客户端


    import
    socket # 产生载体 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # print(phone) # 连接 phone.connect(('127.0.0.1',8081))
    让用户可多次输入对话
    while True: # 发,收信息 cnd = input(">>") if not cnd:continue 当用户输入信息为空时, 返回重新输入 phone.send(cnd.encode('utf-8')) data = phone.recv(1024) print(data.decode('utf-8')) phone.close()

    编写  ssh  连接接口像xhell一样的, 简简单单就行,哈哈哈哈

    那么这里先用python常用的模块演示  os模块

    os 打印命令, 当输入字符串就会执行翻译成命令, 执行win里面的命令实现功能

    代码演示:
    import os 
    os.system("dir D:")  命令+路径即可
    就是这么简单, 这是查看 d 文件下的所有目录

    用套接字这么实现的呢

     这里调用subprocess方法中 的 Popen()方法  

    先解释着个模块是干嘛用的

    1, 是管理和创建进程的, 就是创建命令来实现管理目录

    实现方法  这里是服务端, 要在客户端输入命令来实现

    import socket
    # subprocess 可以帮助把字符串转化为命令
    import subprocess
    # 产生载体
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    # IP绑定
    phone.bind(('127.0.0.1',8081))
    while True:
        phone.listen(5)  # 5 代表最大挂起数
        conn,clinet_addr = phone.accept()
    
        while True:
            try:
                data = conn.recv(1024)  # 处理
                if not data:break
            这里传入字符串,修改为系统命令,可直接当做系统命令使用
                obj = subprocess.Popen(data.decode('utf-8'),shell=True,
                                       stdout=subprocess.PIPE,
                                       stderr=subprocess.PIPE)
                stdout = obj.stdout.read()
                stderr = obj.stderr.read()
    
                conn.send(stdout+stderr)  # 加号是一个可以优化的点
            except ConnectionResetError:
                break
    
        conn.close()
    
    phone.close()
    这只是简单的实现, 还有很多功能没有实现, 如, 当字符超过1024, 则出现自留现象, 不能把超过1024的完整字节打印出来

    自学.....
    有错的多多指点哈, 努力更新中....
  • 相关阅读:
    SQL SERVER或oracl如何判断删除列
    shell date获取时间值
    Zabbix 企业Nginx监控
    Nginx 初探
    Css 基础学习
    jQuery 基础学习
    私有云Mariadb集群搭建
    私有云Rabbitmq 集群部署
    SaltStack Job管理
    Zabbix 监控rabbitmq
  • 原文地址:https://www.cnblogs.com/Knge/p/13289002.html
Copyright © 2011-2022 走看看