python------Socket网略编程

Posted 百里屠苏top

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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左右会存在缓冲区了,等下次发送,但这样会乱,怎么解决?

                答:多收几次。

                问:但具体多收几次呢?

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

 

             

 

         

 

以上是关于python------Socket网略编程的主要内容,如果未能解决你的问题,请参考以下文章

python,socket网络编程,最简单的server端和client端代码

python socket编程tcp/udp俩连接

Python socket编程客户端与服务端通信

python socket网络编程

强化学习笔记:对决网略(dueling network)

Python Socket 编程——聊天室演示样例程序