zoukankan      html  css  js  c++  java
  • python------Socket网略编程

    上节课程回顾

     静态变量:与类无关,不能访问类里的任何属性和方法。

    类方法:只能访问类变量。

    属性:把一个方法变成静态属性,   

    反射:

    __new__:先于__init__执行;

    __call__:

    1 class Foo(object):
    2     def __call__()
    3         print "call"   #这是什么???
    4         
    5 #Foo()  #后面跟一个括号是实例化
    6 Foo()()  #后面跟2个括号是执行call方法

    抓住异常:

    try

       ......

    except (ValueError,KeyError), e     #in 2.7

    except (ValueError,KeyError) as  e     #in 3.x

    else:      #没发生异常就执行

    finally   #无论如何都执行 

    raise (触发自己写的异常)

    except Exception as e   #放在异常处理最后面,

    异常处理:

    断言(assert): 返回为假就不往下执行了。(例如银行转账,要确保正确才能转账)

    例如:assert type(XXX) is str 

    本节内容:

    一.动态导入模块

    1 import importlib
    2  
    3 __import__('import_lib.metaclass') #这是解释器自己内部用的
    4 #importlib.import_module('import_lib.metaclass') #与上面这句效果一样,官方建议用这个

    #__metaclass__用来定义这个类以怎样的形式被创建(我们很少用到)

     本节课内容:

    1.socket :网络上的数据收发。

             tcp/ip  send ,recv

            udp 

            family address (地址簇):

                       AF.INET   (ipv4)

                       AF.INET6

                       AF.UNIX    (local

            socket protocol type (协议类型)

                       sock.SOCK_STREAM    (tcp/ip)

                       sock.SOCK_DGRAM   

             

    服务端步骤:

          server = socket.socket(AF.INET,sock.SOCK_STREAM)

          server.bind(localhost,9999)

           server.listen()

           while True:

                    conn, addr = server.accept()   #阻塞

                    while True:

                           print("new conn", addr)

                           data = conn.recv(1024)  #不应该超过8192(8k)#recv默认是阻塞的

                           if not data:

                                  break   #客户端已断开,conn.recv收到的就是空数据,

                             print(data)

                             conn.send(data.upper())

                   

     客户端步骤:  

                   client = socket.socket()   

                   client.connect(serverip,9999)

                    client.send(data)

                    client.recv(data)

     1 import socket
     2 import os
     3 server = socket.socket()
     4 server.bind(('localhost',1111))
     5 
     6 server.listen()
     7 
     8 while True:
     9     conn,addr = server.accept()
    10     print("new conn:",addr)
    11     while True:
    12         data = conn.recv(1024)
    13         if not data:
    14             print("客户端已断开")
    15             break
    16         print("执行指令:", data)
    17         cmd_res = os.popen(data.decode()).read()   #接收字符串,执行结果也是字符串
    18         conn.send(cmd_res.encode("utf-8"))
    19 
    20 server.close()
     1 import socket
     2 client = socket.socket()
     3 client.connect(('localhost',1111))
     4 
     5 while True:
     6     cmd = input(">>:").strip()   #cmd = input(b">>:").strip()如果前面直接加b,则只能传英文
     7     if len(cmd) == 0 : continue
     8     client.send(cmd.encode())
     9     cmd_res = client.recv(1024)
    10 
    11     print(cmd_res.decode())     
    12 
    13 client.close()

    运行结果:

    >>:ipconfig
    
    Windows IP 配置
    
    
    以太网适配器 以太网:
    
       媒体状态  . . . . . . . . . . . . : 媒体已断开连接
       连接特定的 DNS 后缀 . . . . . . . : 
    
    无线局域网适配器 本地连接* 2:
    
       媒体状态  . . . . . . . . . . . . : 媒体已断开连接
       连接特定的 DNS 后缀 . . . . . . . : 
    
    无线局域网适配器 本地连接* 4:
    
       媒体状态  . . . . . . . . . . . . : 媒体已断开连接
       连接特定的 DNS 后缀 . . . . . . . : 
    
    无线局域网适配器 本地连接* 5:
    
       媒体状态  . . . . . . . . . . . . : 媒体已断开连接
       连接特定的 DNS 后缀 . . . . . . . : 
    
    无线局域网适配器 WLAN:
    
       连接特定的 DNS 后缀 . . . . . . . : workgroup
       本地链接 IPv6 地址. . . . . . . . : fe80::1585:c613:2947:4558%17
       IPv4 地址 . . . . . . . . . . . . : 172.25.81.3
       子网掩码  . . . . . . . . . . . . : 255.255.0.0
       默认网关. . . . . . . . . . . . . : 172.25.81.1
    

     注:1.服务器与客户端解码编码四次。

                2.(1024)传输与接收数据大小的问题:

                    缓冲区:比如一次只能接收1024,发送了2000,省下的900左右会存在缓冲区了,等下次发送,但这样会乱,怎么解决?

                    答:多收几次。

                    问:但具体多收几次呢?

                    答:服务器自己计算一下自己将要给客户端多大的数据,几次能接收完,先把次数发给客户端。

                 

             

  • 相关阅读:
    数组以字符串记录(字符串转数组)
    linux下OpenSSL的RSA密钥生成
    php rsa加密解密实例 及签名验证-自己实践
    php rsa加密解密实例
    PHP的openssl加密扩展使用小结
    支付宝开放平台 配置RSA(SHA1)密钥 OpenSSL配置公钥私钥对
    HTTP缓存控制
    java去任意范围的随机数
    (转)Eclipse4.2 Tomcat启动报错 A child container failed during start
    模态框事件介绍
  • 原文地址:https://www.cnblogs.com/bltstop/p/9893032.html
Copyright © 2011-2022 走看看