Python socket 網絡編程(二)

Python做用域

python中無塊級做用域,是以函數爲做用域python

#python中無塊級做用域
if 1==1:
    name = 'alex'
print(name)

for i in range(10):
    name =i
print(name)

#python 中以函數爲做用域
def func():
    name  = 'alex'
func()
print(name)

python的做用域在執行以前已經肯定。服務器

#python的做用域在執行以前已經肯定
name = 'alex'
def f1():
    print(name)
def f2():
    name = 'eric'
    f1()
f2()

做用鏈多線程

li = [lambda :x for x in range(10)]
r = li [0]()
print(r)

li爲列表併發

li列表中的元素:【函數,函數,函數 ...】app

函數在沒有執行前 ,內部代碼不執行.框架

socket

IO多路複用異步

當一個服務器須要與多個客戶端進行通訊時,能夠使用多進程或者多線程的服務器,也能夠使用select模塊,它能夠實現異步通訊。Python中的select模塊包含了poll()和select(),select的原型爲(rlist,wlist,xlist[,timeout]),其中rlist是等待讀取的對象,wlist是等待寫入的對象,xlist是等待異常的對象,最後一個是可選對象,指定等待的時間,單位是s. select()方法的返回值是準備好的對象的三元組,若在timeout的時間內,沒有對象準備好,那麼返回值將是空的列表。

概述
select , poll , epollsocket

監聽 socket 對象內部是否變化了?連接或者收發消息會發生變化函數

socket實現僞併發線程

socket服務器端

import socket
import select

sk = socket.socket()
sk.bind(('127.0.0.1',999,))
sk.listen(5)

inputs = [sk,]
while True:
    rlist,w,e = select.select([sk,],[],[],1)
    #print(rlist)
    print(len(inputs),len(rlist))
    #監聽sk(服務器端)對象,若是sk對象發生變化,表示 有客戶端來鏈接了,此時rlist值爲 【sk】
    # 監聽conn對象,若是conn發生變化,表示客戶端有新消息發送過來了,此時rlist的之爲 【客戶端】
    for r in rlist:
        if r == sk:
            #新客戶來鏈接
            conn,address = r.accept()
            #conn是什麼?其實socket對象
            inputs.append(conn)
            conn.sendall(bytes('hello',encoding='utf-8'))
        else:
            print('======>')
            try:
                ret = r.recv(1024)
                if not ret:
                    raise Exception('斷開鏈接')
            except Exception as e:
                inputs.remove(r)

socket讀寫分離

服務器端

import socket
import select

sk = socket.socket()
sk.bind(('127.0.0.1',999,))
sk.listen(5)

inputs = [sk,]
outputs = []
while True:
    rlist,wlist,e = select.select(inputs,outputs,[],1)
    #print(rlist)
    print(len(inputs),len(rlist),len(wlist),len(outputs))
    #監聽sk(服務器端)對象,若是sk對象發生變化,表示 有客戶端來鏈接了,此時rlist值爲 【sk】
    # 監聽conn對象,若是conn發生變化,表示客戶端有新消息發送過來了,此時rlist的之爲 【客戶端】
    for r in rlist:
        if r == sk:
            #新客戶來鏈接
            conn,address = r.accept()
            #conn是什麼?其實socket對象
            inputs.append(conn)
            conn.sendall(bytes('hello',encoding='utf-8'))
        else:
            #r.recv(1024)
            print('======>')
            try:
                ret = r.recv(1024)
                if not ret:
                    raise Exception('斷開鏈接')
                else:
                    outputs.append(r)
            except Exception as e:
                inputs.remove(r)
    for w in wlist:
        w.sendall(bytes('response',encoding='utf-8'))
        outputs.remove(w)

socket客戶端

import socket
sk = socket.socket()
sk.connect(("127.0.0.1",999,))
data = sk.recv(1024)
print(data)
while True:
    inp = input('>>>>')
    sk.sendall(bytes(inp,encoding='utf-8'))
sk.close()

socket server

SocketServer模塊是標準庫中不少其餘服務器框架的基礎,這些服務器框架包括:BaseHTTPServer、SimpleHTTPServer、CGIHTTPServer、SimpleXMLRPCServer和DocXMLRPCServer,這些服務框架都是在基礎框架上增長了特定的功能。SocketServer包含了4個基本的類:

  • TCPServer,針對TCP的Socket
  • UDPServer,針對UDP數據報的Socket
  • UnixStreamServer
  • UnixDatagramServer

    下面是一個基於SocketServer的簡單Socket Server端示例:

from SocketServer import TCPServer, StreamRequestHandler
class Handler(StreamRequestHandler):
    def handle(self):
        addr = self.request.getpeername()
        self.wfile.write('Thank you for connectiong')
server = TCPServer(('',8088),Handler)
server.serve_forever()

多線程 多進程

概述:
def f1(arg):
    print(arg)

import threading
t = threading.Thread(target =f1,args=(123,))
t.setDaemon(True)#true,表示主線程不等子線程
t.start() #不表明當前線程會被當即執行
t.join(2)   # 表示主線程到此,等待..直到子線程執行完畢
            #參數,表示主線程在此最多等待n秒
f1(1111)
相關文章
相關標籤/搜索