http://blog.csdn.net/calling_wisdom/article/details/42524745python
今天用python的socket模塊實現了一個聊天室的程序服務器
雖然功能比較簡單,可是該有的基本功能仍是有的app
還望你們指點dom
服務器端程序:socket
- 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(mydict[connNumber], ':', recvedMsg)
- tellOthers(connNumber, mydict[connNumber]+' :'+recvedMsg)
-
- except (OSError, ConnectionResetError):
- try:
- mylist.remove(myconnection)
- except:
- pass
- print(mydict[connNumber], 'exit, ', len(mylist), ' person left')
- tellOthers(connNumber, '【系統提示:'+mydict[connNumber]+' 離開聊天室】')
- myconnection.close()
- return
-
- while True:
- connection, addr = sock.accept()
- print('Accept a new connection', connection.getsockname(), connection.fileno())
- try:
-
- buf = connection.recv(1024).decode()
- if buf == '1':
- 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
客戶端程序:this
- import socket
- import time
- import threading
-
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-
- sock.connect(('localhost', 5550))
- sock.send(b'1')
- print(sock.recv(1024).decode())
- nickName = raw_input('input your nickname: ')
- sock.send(nickName.encode())
-
- def sendThreadFunc():
- while True:
- try:
- myword = raw_input()
- sock.send(myword.encode())
-
- except ConnectionAbortedError:
- print('Server closed this connection!')
- except ConnectionResetError:
- print('Server is closed!')
-
- def recvThreadFunc():
- while True:
- try:
- otherword = sock.recv(1024)
- if otherword:
- print(otherword.decode())
- else:
- pass
- except ConnectionAbortedError:
- print('Server closed this connection!')
-
- except ConnectionResetError:
- print('Server is closed!')
-
-
- th1 = threading.Thread(target=sendThreadFunc)
- th2 = threading.Thread(target=recvThreadFunc)
- threads = [th1, th2]
-
- for t in threads :
- t.setDaemon(True)
- t.start()
- t.join()
代碼執行效果圖:spa
聊天過程1:.net
系統監視:線程
聊天過程 2 :code
系統監視: