socket(二)
作用域
1 2 3 | if 1 = = 1 : name = 'alex' print (name) |
python中是没有块儿作用域的,所以python可以输出name
java/c中有块级作用域,提示name没有定义
Python中无块级作用域
1 2 3 4 | # if 1 == 1: # name = 'alex' # print(name) #输出结果为alex |
1 2 3 4 5 6 7 8 9 10 11 | # for i in range(10): # name = i # print((name)) #输出结果为:9 # def func(): # name = 'alex' # func() # # print(name) #执行结果报错:name is notdefined |
#Python中是由作用域链的,找变量的时候是由内向外找,知道找不到报错。
#提示:Python的作用域在执行前已经确定。 函数未执行前作用域链就已经确定了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | name = 'alex' def f1(): print (name) def f2(): name = 'eric' """ """ name = 'alex' def f1(): print (name) def f2(): name = 'eric' return f1 ret = f2() ret() """ """ li = [ lambda :x for x in range ( 10 )] r = li[ 0 ]() print (r) |
#li是列表
#li列表中的元素:【函数,函数,函数。。。。】
#函数在没有执行前,内部代码不执行
#?li[0],函数
#?函数()
#返回值是???
python2中默认经典类,如果继承object()是新式类
python3中默认新式类
I/O多路复用
server端:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import socket import select sk = socket.socket() sk.bind(( '127.0.0.1' , 9999 ,)) sk.listen( 5 ) inputs = [sk, ] while True : rlist, w, e = select.select(inputs,[],[], 1 ) #inputs:列表中存放sk,和conn对象,如果有新连接请求过来,sk对象就会变化,rlist就等于sk, #如果是已经建立的连接,发过来消息,返回的就是conn的对象 print (rlist) # 监听sk(服务器端)对象,入股osk对象发生变化,表示客户端来连接了,此时rlist值为[sk] # 监听conn对戏那个,如果conn发生变化,表示客户端有新消息发送过来了,此时rlist的值为[客户端] # rlist = [wuwenyu,] # rlist = [zhanglei, ] # rlist = [sk] # rlist 中socket对象列表,[sk,] for r in rlist: if r = = sk: #新客户来连接,则建立新的conn,把conn加入到inputs列表中 #如果r != sk,则是已经建立连接的对象,conn,那么conn接收消息。 conn, address = r.accept() #conn是什么? 其实就是socket对象 inputs.append(conn) conn.sendall(bytes( 'hello' , encoding = 'utf-8' )) #rlist = [sk,], rlist =[sk1,],rlist = [sk1,sk2] #rlist = [] else : #有人给我发消息了 r.recv( 1024 ) |
client端:
1 2 3 4 5 6 7 8 9 10 11 12 13 | import socket sk = socket.socket() sk.connect(( "127.0.0.1" , 9999 , )) data = sk.recv( 1024 ) print (data) while True : inp = input ( ">>>" ) sk.sendall(bytes(inp, encoding = 'utf-8' )) sk.close() |