参考来源(其实我从上面复制了一点):
Python 的 Socket 编程教程 http://www.oschina.net/question/12_76126
Python线程指南 http://www.open-open.com/lib/view/open1345476194313.html
Python 的 Socket 编程教程 http://www.oschina.net/question/12_76126
Python线程指南 http://www.open-open.com/lib/view/open1345476194313.html
Python Socket文档 https://docs.python.org/3/library/socket.html#socket-objects
具体思路:
每个client有两个线程,分别负责接收和发送,当没有发送时,在raw_input()那卡住,当没有接收时,在recv()那卡住
server为每个client开两个线程,分别处理接收和发送。每个发送的线程在con.wait()那阻塞,等待notify。每个接收的线程,在recv()那里等待来自client的输入,接收到输入后,发出一个notify,激活所有输出线程,自身则因为循环在下一个recv()那里等待。
这样做的优势时在等待期间,cpu都处于空闲状态,cpu只在接收和发送的瞬间被使用。
目前没有想到更好方法。。。
注意:
我做得有点粗糙,复制后有些注释和代码对应不起来,也没有添加新的注释
具体思路:
每个client有两个线程,分别负责接收和发送,当没有发送时,在raw_input()那卡住,当没有接收时,在recv()那卡住
server为每个client开两个线程,分别处理接收和发送。每个发送的线程在con.wait()那阻塞,等待notify。每个接收的线程,在recv()那里等待来自client的输入,接收到输入后,发出一个notify,激活所有输出线程,自身则因为循环在下一个recv()那里等待。
这样做的优势时在等待期间,cpu都处于空闲状态,cpu只在接收和发送的瞬间被使用。
目前没有想到更好方法。。。
注意:
我做得有点粗糙,复制后有些注释和代码对应不起来,也没有添加新的注释
标签: <无>
代码片段(4)[全屏查看所有代码]
1. [文件] client.py ~ 976B 下载(283)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | # -*- coding: utf-8 -*-"""Created on Thu Oct 24 17:35:50 2013@author: zbg"""import socketimport threadinginString = ''outString = ''nick = ''def DealOut(s): global nick, outString while True: outString = raw_input() outString = nick + ': ' + outString s.send(outString)def DealIn(s): global inString while True: try: inString = s.recv(1024) if not inString: break if outString != inString: print inString except: break nick = raw_input("input your nickname: ")ip = raw_input("input the server's ip adrress: ")sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.connect((ip, 8888))sock.send(nick)thin = threading.Thread(target = DealIn, args = (sock,))thin.start()thout = threading.Thread(target = DealOut, args = (sock,))thout.start()#sock.close() |
2. [文件] server.py ~ 2KB 下载(285)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | # -*- coding: utf-8 -*-"""Created on Fri Oct 25 10:33:44 2013@author: zbg"""import socketimport sysimport threadingcon = threading.Condition()HOST = raw_input("input the server's ip adrress: ") # Symbolic name meaning all available interfacesPORT = 8888 # Arbitrary non-privileged portdata = ''s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)print 'Socket created's.bind((HOST, PORT))s.listen(10)print 'Socket now listening'#Function for handling connections. This will be used to create threadsdef clientThreadIn(conn, nick): global data#infinite loop so that function do not terminate and thread do not end. while True: #Receiving from client try: temp = conn.recv(1024) if not temp: conn.close() return NotifyAll(temp) print data except: NotifyAll(nick + " leaves the room!") print data return #came out of loopdef NotifyAll(sss): global data if con.acquire(): data = sss con.notifyAll() con.release() def ClientThreadOut(conn, nick): global data while True: if con.acquire(): con.wait() if data: try: conn.send(data) con.release() except: con.release() return while 1: #wait to accept a connection - blocking call conn, addr = s.accept() print 'Connected with ' + addr[0] + ':' + str(addr[1]) nick = conn.recv(1024) #send only takes string #start new thread takes 1st argument as a function name to be run, second is the tuple of arguments to the function. NotifyAll('Welcome ' + nick + ' to the room!') print data print str((threading.activeCount() + 1) / 2) + ' person(s)!' conn.send(data) threading.Thread(target = clientThreadIn , args = (conn, nick)).start() threading.Thread(target = ClientThreadOut , args = (conn, nick)).start()s.close() |

