3.socket编程示例

♀尐吖头ヾ 提交于 2020-02-17 05:09:30
#block_server.py 非阻塞IO示例#有个疑惑:下面的connfd的blockind要设置为True,不然会出错,待解决from socket import *from time import ctime,sleeps = socket()s.bind(("0.0.0.0",18888))s.listen(10)#设置s为非阻塞状态s.setblocking(False)while True:    print("等待连接...")    try:        connfd,addr = s.accept()    except BlockingIOError:        sleep(2)        print(ctime())        continue    print("connect from",addr)    while True:        connfd.setblocking(True)        data = connfd.recv(1024)        if not data:            break        print(data.decode())        serv_msg = input("服务端消息>")        connfd.send(serv_msg.encode())    connfd.close()s.close()=========================================#timeout_server.py 超时检测示例及tracebackfrom socket import *from time import sleep,ctimeimport tracebackHOST = "0.0.0.0"PORT = 14444s = socket()s.bind((HOST,PORT))s.listen(5)#设置超时检测s.settimeout(5)while True:    print("服务端等待连接.....")    try:        c,addr = s.accept()    except Exception:        traceback.print_exc()        continue    print("connect from",addr)    while True:        data = c.recv(1024)        if not data:            break        print(data.decode())        serv_msg = input("服务端消息>")        c.send(serv_msg.encode())    c.close()s.close()==========================================#select_server.py select服务端示例from socket import *from select import *HOST = "0.0.0.0"PORT = 18888s = socket()s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)s.bind((HOST,PORT))s.listen(5)#将需要监控的IO放入rlistrlist = [s]wlist = []xlist = []print("select服务器启动成功")while True:    print(f"select正在监控阻塞套接字{rlist}")    print(f"目前列表中有{len(rlist)}个套接字")    rl,wl,xl = select(rlist,wlist,xlist)    for r in rl:        #套接字准备就绪        if r is s:            conn,addr = r.accept()            print("Connect from",addr)            #把新的套接字加入监控列表            rlist.append(conn)        else:            data = r.recv(1024)            if not data:                rlist.remove(r)                r.close()                break            print("received:",data.decode())            r.send("已经收到".encode())    for w in wl:        pass    for x in xl:        pass===============================================#select_server2_wlist.py select服务端示例,演示wlist,xlist用法from socket import *from select import *import sysHOST = "0.0.0.0"PORT = 18888s = socket()s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)s.bind((HOST,PORT))s.listen(5)#将需要监控的IO放入rlistrlist = [s]wlist = []xlist = [s]print("select服务器启动成功")while True:    print(f"select正在监控阻塞套接字{rlist}")    print(f"目前列表中有{len(rlist)}个套接字")    rl,wl,xl = select(rlist,wlist,xlist)    for r in rl:        #套接字准备就绪        if r is s:            conn,addr = r.accept()            print("Connect from",addr)            #把新的套接字加入监控列表            rlist.append(conn)        else:            data = r.recv(1024)            if not data:                rlist.remove(r)                r.close()                break            else:                print(f"received from {str(r.getpeername())}:{data.decode()}",)                #接收完消息,把套接字加入wlist列表,待处理(当wlist内有内容,select会立即返回)                wlist.append(r)    # 当上一步待处理套接字加入wlist,这步立刻处理,处理完把该套接字移出wlist    for w in wl:        w.send(f"已经收到你的消息{str(w.getpeername())}".encode())        wlist.remove(w)    for x in xl:        #如果套接字出错,结束整个程序        if x is s:            s.close()            sys.exit()    =============================================================    #unix_send.py 本地套接字简单应用,发送端    from socket import *    import sys,os    #确定用哪个文件进行通信    server_address = "./test"    #判断文件是否存在,如已存在则删除    if os.path.exists(server_address):        os.unlink(server_address)    #创建本地套接字    s = socket(AF_UNIX,SOCK_STREAM)    #绑定本地套接字文件    s.bind(server_address)    #监听    s.listen(5)    #收发消息    while True:        c,addr = s.accept()        while True:            data = c.recv(1024)            if data:                print(data.decode())                c.sendall("收到消息".encode())            else:                break        c.close()    s.close()    ========================================================    #unix_recv.py 本地套接字简单应用,接收端    from socket import *    server_address = "./test"    s = socket(AF_UNIX,SOCK_STREAM)    s.connect(server_address)    while True:        message = input("客户端消息")        if message:            s.sendall(message.encode())            recv_msg = s.recv(1024)            print(recv_msg.decode())        else:            break    s.close()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!