#服务端 import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() while True: conn, address = sk.accept() while True: ret = conn.recv(1024) print(ret) inp = input('>>>') conn.sendall(inp.encode('utf-8')) # conn.sendall(bytes(inp, 'utf-8')) #客户端 import socket sk=socket.socket() sk.connect(('127.0.0.1',8080)) while True: inp=input('>>>>') sk.sendall(bytes(inp,'utf-8')) data=sk.recv(1024) print(str(data,'utf-8'))
#非阻塞IO进行recvform系统调用,会马上得到一个结果,如果结果是一个error(异常处理) # 此时证明数据还未准备好,在等在下次进行recvform系统调用的期间,进程可以做其他事情 #这个过程非阻塞将整片时间片分成N多小阻塞,循环往复的进行recvform的系统调用 #服务端 import time import socket import os sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # sk.setsockopt sk.bind(('127.0.0.1',8080)) sk.listen(5) sk.setblocking(False) while True: try: print('waiting client connection.......') conn,address =sk.accept() # print(os.getpid()) print('++++',address) ret = conn.recv(1024) #系统级内核数据拷贝到用户级内存 print(ret) conn.close() except Exception as e: print(e) time.sleep(4)#在此期间进程可以做其他任务 #客户端 import time import socket sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM) while True: sk.connect(('127.0.0.1',8080)) print('hello') sk.sendall(b'hello') time.sleep(2) break
#select的使用#服务端 import socket import select sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen(5) sk.setblocking(False) inputs=[sk,] #监听一个活动对象的列表 while True: r,w,e=select.select(inputs,[],[],5) #哪个对象活动了,r就会被选出来 print('可活动的列表长度%s' % len(inputs)) print('活动的对象只有%s个' % len(r)) # print(type(r)) for obj in r: if obj==sk: conn,add=obj.accept() print('conn:',conn) inputs.append(conn) #客户端的套接字对象放入活动列表中 print('append之后<<<',r) else: data_byte=obj.recv(1024) print(str(data_byte,'utf-8')) if not data_byte: inputs.remove(obj) continue inp=input('回答%s >>>' % inputs.index(obj)) obj.sendall(bytes(inp,'utf-8')) print('结尾>>>',r) #客户端 import socket sk=socket.socket() sk.connect(('127.0.0.1',8080)) while True: inp=input('>>>>') sk.sendall(bytes(inp,'utf-8')) data=sk.recv(1024) print(str(data,'utf-8'))
参考资料:http://www.cnblogs.com/Eva-J/articles/8324837.html