#!C:/Python27
#coding=utf-8
import socket
import threading
HOST = "localhost"
PORT = 6666
ADDR = (HOST, PORT)
srv_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv_sock.bind((HOST,PORT))
srv_sock.listen(5)#监听连接 满了挂起 5
print "\nlisting..."
con = threading.Condition()#判断条件 锁
data = ""
"""
conn 为新的套接字对象,可以用来接收和发送数据。
address是连接客户端的地址接收TCP客户的连接
"""
def NotifyAll(sss):
global data
if con.acquire():#获取锁
data = sss
con.notifyAll()#表示当前线程放弃对资源的占用 通知其他线程
con.release() #释放锁
def ThreadOut(conn,nick):
global data
while True:
if con.acquire():
con.wait()#会阻塞在这里 放弃对当前资源的占用 等
if data:
try:
conn.send(data)#发送
con.release()
except:
con.release()
return
def ThreadIn(conn,nick):#接收消息
while True:
try:
temp = conn.recv(1024)
if not temp:
conn.close()
return
NotifyAll(temp)
print data
except:
NotifyAll(nick+'happen error...')
print "异常数据:",data
return
"""
1、将所有客户端的连接对象,保存到list中
2、服务端将消息转发到其中一个客户端的连接对象
"""
clientlist = []
while True:
conn,address = srv_sock.accept()
print "\n客服端连接地址:",address
print "\nIP:",address[0],"PORT:",address[1]
nick = conn.recv(1024)
print "\n",nick #接收昵称
NotifyAll('Welcome '+nick+' to the room!!!\n')
print data
conn.send(data)
clientlist.append(address)
#conn.sendto("9999999",clientlist[0])
#接收一个数据
#len = sizeof(struct,addr1)
data1,addr1=conn.recvfrom(1024)
print 'Received:',data1,'from:',len(addr1),addr1
print "IP: ",addr1[0],"PORT: ",addr1[1]
conn.sendto(b'this is is IP',(HOST,PORT))
print "\n客户端连接集合个数为:",len(clientlist),clientlist
threading.Thread(target=ThreadOut,args=(conn,nick)).start()
threading.Thread(target=ThreadIn,args=(conn,nick)).start()