zoukankan      html  css  js  c++  java
  • Python socket 网络编程(二)

    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列表中的元素:【函数,函数,函数 ...】

    函数在没有执行前 ,内部代码不执行.

    socket

    IO多路复用

    当一个服务器需要与多个客户端进行通信时,可以使用多进程或者多线程的服务器,也可以使用select模块,它可以实现异步通信。Python中的select模块包含了poll()和select(),select的原型为(rlist,wlist,xlist[,timeout]),其中rlist是等待读取的对象,wlist是等待写入的对象,xlist是等待异常的对象,最后一个是可选对象,指定等待的时间,单位是s. select()方法的返回值是准备好的对象的三元组,若在timeout的时间内,没有对象准备好,那么返回值将是空的列表。####

    概述
    select , poll , epoll

    监听 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)
    
  • 相关阅读:
    JavaScript 对象
    Java条件语句
    函数的使用注意事项:
    函数的特点
    函数的格式
    for循环
    break和continue的区别和作用
    注意事项
    CSS浮动清除的方法
    转:Oracle 中union的用法
  • 原文地址:https://www.cnblogs.com/postgres/p/5666415.html
Copyright © 2011-2022 走看看