#! /usr/bin/python3.4
from socket import *
from time import ctime
import select
import queue
from time import sleep
host = '127.0.0.1'
port = 8888
buffsize = 2048
ADDR = (host,port)
server = socket(AF_INET,SOCK_STREAM)
server.bind(ADDR)
server.listen(5)
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) # 设置端口复用
inputs = [server]
outputs = []
message_queues = {}
while True:
print('Waiting for the next event ...')
readable,writeable,exceptional = select.select(inputs,outputs,inputs)# 设置监视
#print('正在监听的socket对象%d' % (len(inputs)))
for s in readable:# 监视可读信息
if s == server: # 有新用户连接
client,addr = s.accept() # 接受连接
print("\033[35mConnection from :",addr,"\033[0m") # 打印对方信息
client.setblocking(0) #设置程序非阻塞
inputs.append(client) # 加入到输入列表中
# message_queues[client]=queue.Queue()
else: # 有老用户发信息
data = s.recv(buffsize).decode()# 接收信息
if (data == 'quit' or data ==''): # 如果data为quit
print("\033[31mclosing ... ", s.getpeername(),"\033[0m")
if s in outputs: # 如果在输出列表中
outputs.remove(s) # 移出输出列表
inputs.remove(s) # 移出输入列表
s.close() # 关闭连接
else:# 如果data不为空
k=s.getpeername() # 得到发送方的信息
print("\033[32mrecvData = ","%s" %(data),"[from" , k,"]\033[0m")
data = "Thank for your message ..."
s.send(data.encode())
# 处理异常的情况
for s in exceptional:
print ('exception condition on', s.getpeername())
inputs.remove(s)
if s in outputs:
outputs.remove(s)
s.close()
client.close()
客户端:
#! /usr/bin/python3.4
from socket import *
import threading
import _thread
import time
import os
HOST ='127.0.0.1'
PORT = 8888
BUFFSIZE=2048
ADDR = (HOST,PORT)
client = socket(AF_INET,SOCK_STREAM)
client.connect(ADDR)
def sendData():
while True:
print("\033[32msendData = " ,end = '')
data = input()
print("\033[0m",end='')
client.send(data.encode())
if data == 'quit':
print("\033[31mexiting for you ... \033[0m\n")
os._exit(0)
time.sleep(1)
def recvData():
while True:
data = client.recv(BUFFSIZE).decode()
print("\033[33mrecvData = ","%s\033[0m" %(data))
if not data:
continue
def main():
s2=threading.Thread(target=recvData,name='')#创建接收数据的线程
s1=threading.Thread(target=sendData,name='')#创建发送数据的线程
s2.start()#运行线程
s1.start()#运行线程
if __name__ == '__main__':
main()
运行效果图:
服务器:
客户端:
用CTRL_C退出的时候服务器也会显示closing ....(data == ' '时)