zoukankan      html  css  js  c++  java
  • python socket 多人聊天室

    参考来源(其实我从上面复制了一点):
    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只在接收和发送的瞬间被使用。
    目前没有想到更好方法。。。

    注意:
    我做得有点粗糙,复制后有些注释和代码对应不起来,也没有添加新的注释
     
    标签: <无>
     

    代码片段(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 socket
    import threading
     
     
    inString = ''
    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 socket
    import sys
    import threading
     
    con = threading.Condition()
    HOST = raw_input("input the server's ip adrress: ") # Symbolic name meaning all available interfaces
    PORT = 8888 # Arbitrary non-privileged port
    data = ''
     
    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 threads
    def 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 loop
     
    def 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. [图片] QQ截图20131027115134.png    

    4. [图片] QQ截图20131027115232.png    

  • 相关阅读:
    HTML总结
    js五角星评分特效
    正则表达式
    C#文件路径的写法
    vs2010发布网站
    INI文件阅读器
    .net读取xml文件中文乱码问题解决办法
    js利用定时器动态改变层大小
    c#中ref和out的用法
    分享一篇关于C#对文件操作的日志,方法很全
  • 原文地址:https://www.cnblogs.com/zknublx/p/7071481.html
Copyright © 2011-2022 走看看