http://blog.csdn.net/calling_wisdom/article/details/42524745
今天用python的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()
- #把whatToSay传给除了exceptNum的所有人
- 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:
- #connection.settimeout(5)
- 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
客户端程序:
- 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())
- #print(sock.recv(1024).decode())
- 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()
代码执行效果图:
聊天过程1:
系统监视:
聊天过程 2 :
系统监视: