Python socket multi-person chat room

Source: Internet
Author: User

Reference source (actually I copied a little from the above):
Python's Socket Programming tutorial http://www.oschina.net/question/12_76126
Python Threading Guide Http://www.open-open.com/lib/view/open1345476194313.htmlPython socket document https://docs.python.org/3/ Library/socket.html#socket-objects

Specific ideas:
Each client has two threads, each responsible for receiving and sending, when not sent, in Raw_input () that stuck, when not receiving, in recv () that stuck
Server opens two threads for each client, processing both receive and send. Each thread that is sent is blocked in con.wait (), waiting for notify. Each received thread waits for input from the client at recv (), receives input, emits a notify, activates all output threads, and itself waits for the loop to be in the next recv ().

The advantage of doing this is that the CPU is idle during the wait, and the CPU is used only in the instant that it is received and sent.
There is no better way to think about ...

Attention:
I did a little rough, and after copying some comments and the code did not match, and no new comments added Tags:< no > Code Snippets (4) [Full screen view all code]1. [File] client.py ~ 976B Download (283)?
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 # -*- 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. [File] server.py ~ 2KB Download (285)?
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 666768697071727374757677 # -*- 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()
3. [Image] Qq20131027115134.png 4. Picture Qq20131027115232.png

Python socket multi-person chat room

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.