import socket
import threading
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 5550))
sock.listen(5)
print('Server', socket.gethostbyname('localhost'), 'listening ...')
mydict = dict()
mylist = list()
def tellOthers(exceptNum, whatToSay):
for c in mylist:
if c.fileno() != exceptNum :
try:
c.send(whatToSay.encode())
except:
pass
def subThreadIn(myconnection, connNumber):
#nickname = myconnection.recv(1024).decode()
#mydict[myconnection.fileno()] = nickname
mylist.append(myconnection)
#print('connection', connNumber, ' has nickname :', nickname)
#tellOthers(connNumber, '【系統提示:'+mydict[connNumber]+' 進入】')
while True:
try:
recvedMsg = myconnection.recv(1024).decode()
if recvedMsg:
print(recvedMsg)
#tellOthers(connNumber, mydict[connNumber]+' :'+recvedMsg)
sock.send('quit'.encode())
except (OSError, ConnectionResetError):
try:
mylist.remove(myconnection)
except:
pass
print('Client left')
#tellOthers(connNumber, '【系統提示:'+mydict[connNumber]+' 離開】')
myconnection.close()
return
while True:
connection, addr = sock.accept()
print('Accept a new connection', connection.getsockname(), connection.fileno())
try:
#connection.settimeout(5)
buf = connection.recv(1024).decode()
if buf:
connection.send(b'welcome to server!')
#為當前連結開啟一個新的執行緒
mythread = threading.Thread(target=subThreadIn, args=(connection, connection.fileno()))
mythread.setDaemon(True)
mythread.start()
else:
connection.send(b'please go out!')
connection.close()
except :
pass
aW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCiAKc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKIApzb2NrLmJpbmQoKCdsb2NhbGhvc3QnLCA1NTUwKSkKIApzb2NrLmxpc3Rlbig1KQpwcmludCgnU2VydmVyJywgc29ja2V0LmdldGhvc3RieW5hbWUoJ2xvY2FsaG9zdCcpLCAnbGlzdGVuaW5nIC4uLicpCiAKbXlkaWN0ID0gZGljdCgpCm15bGlzdCA9IGxpc3QoKQogCmRlZiB0ZWxsT3RoZXJzKGV4Y2VwdE51bSwgd2hhdFRvU2F5KToKICAgIGZvciBjIGluIG15bGlzdDoKICAgICAgICBpZiBjLmZpbGVubygpICE9IGV4Y2VwdE51bSA6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGMuc2VuZCh3aGF0VG9TYXkuZW5jb2RlKCkpCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIHBhc3MKIApkZWYgc3ViVGhyZWFkSW4obXljb25uZWN0aW9uLCBjb25uTnVtYmVyKToKICAgICNuaWNrbmFtZSA9IG15Y29ubmVjdGlvbi5yZWN2KDEwMjQpLmRlY29kZSgpCiAgICAjbXlkaWN0W215Y29ubmVjdGlvbi5maWxlbm8oKV0gPSBuaWNrbmFtZQogICAgbXlsaXN0LmFwcGVuZChteWNvbm5lY3Rpb24pCiAgICAjcHJpbnQoJ2Nvbm5lY3Rpb24nLCBjb25uTnVtYmVyLCAnIGhhcyBuaWNrbmFtZSA6Jywgbmlja25hbWUpCiAgICAjdGVsbE90aGVycyhjb25uTnVtYmVyLCAn44CQ57O757Wx5o+Q56S677yaJytteWRpY3RbY29ubk51bWJlcl0rJyDpgLLlhaXjgJEnKQogICAgd2hpbGUgVHJ1ZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlY3ZlZE1zZyA9IG15Y29ubmVjdGlvbi5yZWN2KDEwMjQpLmRlY29kZSgpCiAgICAgICAgICAgIGlmIHJlY3ZlZE1zZzoKICAgICAgICAgICAgICAgIHByaW50KHJlY3ZlZE1zZykKICAgICAgICAgICAgICAgICN0ZWxsT3RoZXJzKGNvbm5OdW1iZXIsIG15ZGljdFtjb25uTnVtYmVyXSsnIDonK3JlY3ZlZE1zZykKICAgICAgICAgICAgICAgIHNvY2suc2VuZCgncXVpdCcuZW5jb2RlKCkpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBDb25uZWN0aW9uUmVzZXRFcnJvcik6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG15bGlzdC5yZW1vdmUobXljb25uZWN0aW9uKQogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIHByaW50KCdDbGllbnQgbGVmdCcpCiAgICAgICAgICAgICN0ZWxsT3RoZXJzKGNvbm5OdW1iZXIsICfjgJDns7vntbHmj5DnpLrvvJonK215ZGljdFtjb25uTnVtYmVyXSsnIOmboumWi+OAkScpCiAgICAgICAgICAgIG15Y29ubmVjdGlvbi5jbG9zZSgpCiAgICAgICAgICAgIHJldHVybgogCndoaWxlIFRydWU6CiAgICBjb25uZWN0aW9uLCBhZGRyID0gc29jay5hY2NlcHQoKQogICAgcHJpbnQoJ0FjY2VwdCBhIG5ldyBjb25uZWN0aW9uJywgY29ubmVjdGlvbi5nZXRzb2NrbmFtZSgpLCBjb25uZWN0aW9uLmZpbGVubygpKQogICAgdHJ5OgogICAgICAgICNjb25uZWN0aW9uLnNldHRpbWVvdXQoNSkKICAgICAgICBidWYgPSBjb25uZWN0aW9uLnJlY3YoMTAyNCkuZGVjb2RlKCkKICAgICAgICBpZiBidWY6CiAgICAgICAgICAgIGNvbm5lY3Rpb24uc2VuZChiJ3dlbGNvbWUgdG8gc2VydmVyIScpCiAKICAgICAgICAgICAgI+eCuueVtuWJjemAo+e1kOmWi+WVn+S4gOWAi+aWsOeahOWft+ihjOe3kgogICAgICAgICAgICBteXRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXN1YlRocmVhZEluLCBhcmdzPShjb25uZWN0aW9uLCBjb25uZWN0aW9uLmZpbGVubygpKSkKICAgICAgICAgICAgbXl0aHJlYWQuc2V0RGFlbW9uKFRydWUpCiAgICAgICAgICAgIG15dGhyZWFkLnN0YXJ0KCkKICAgICAgICAgICAgCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29ubmVjdGlvbi5zZW5kKGIncGxlYXNlIGdvIG91dCEnKQogICAgICAgICAgICBjb25uZWN0aW9uLmNsb3NlKCkKICAgIGV4Y2VwdCA6ICAKICAgICAgICBwYXNz