参考来源(其实我从上面复制了一点):
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

python socket 多人聊天室相关推荐

  1. 基于python面向对象多人聊天室

    基于python面向对象多人聊天室 1.项目环境 项目名称:多人聊天室 项目模式:C/S 开发环境:win10+python3.8+pycharm 所需知识:python GUI编程,多线程编程,网络 ...

  2. 基于Python的多人聊天室的设计与实现

    基于Python的多人聊天室的设计与实现 摘要  本文介绍了基于即时通讯的Python实现web版多人聊天室的设计和实现.这个系统利用了多种先进的技术,如Django.Channels.WebSock ...

  3. java socket多人聊天室_如何运用Java socket实现多人聊天室功能

    如何运用Java socket实现多人聊天室功能 导语:如何运用Java socket实现多人聊天室功能呢?下面是小编给大家提供的代码实现,大家可以参考阅读,更多详情请关注应届毕业生考试网. 目录结构 ...

  4. socket多人聊天室c语言,一分钟实现网页多人聊天室【Socket.IO】

    socket.io是个基于node.js的快平台实时通讯框架.只用不到10行代码,就可以搭建一个简单的多人实时聊天室. 先来看看运行后的效果: socket.io多人聊天室 只要简单几步,就可以实现. ...

  5. Linux下socket多人聊天室

    目录 前言 一.聊天室的实验内容 二.逐个功能的简单分析 三.系统功能模块分解图 1.服务端功能模块图 2.客户端功能模块图 3.守护进程功能模块图 四.功能模块流程图 1.服务端流程图 2.客户端流 ...

  6. vc udp 广播接收和发送_udp聊天?使用udp+python实现多人聊天室

    信来到这个文章里面的朋友不会对udp陌生,话不多说直接开始. 由于udp没有建立连接,也没有实际上的客户端和服务器端. 但是我们需要让一个udp来充当服务器!实现消息广播从而达到聊天室的效果. 以下是 ...

  7. Python简单多人聊天室

    # ------------------------------服务器端-----------------------------------------# auther: kele # 创建时间:2 ...

  8. python实现简易聊天需要登录博客园zip下载_Python基于Socket实现简易多人聊天室的示例代码...

    前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 套接字可以通过多种不同的 ...

  9. python聊天室_python实现简单多人聊天室

    本文实例为大家分享了python实现多人聊天室的具体代码,供大家参考,具体内容如下 刚开始学习python,写了一个聊天室练练手. Server.py import socket,select,thr ...

最新文章

  1. 干货 | 5个常用的深度学习框架
  2. 下的生产环境was重新启动不同意,怎么做?
  3. linux命令:fsck
  4. Activiti工作流之实现一个简单的流程审批
  5. Python爬取猪肉价格网并获取Json数据
  6. UITableView中cell的圆角(第一个和最后一个)
  7. 多溴联苯醚内分泌干扰效应机制研究取得进展
  8. chage 修改用户密码有效期限的命令
  9. HTML打开网页拒绝访问,192.168.1.1拒绝访问怎么办?
  10. DEV-C上的报错 Process exited after 4.03 seconds with return value 3221225725
  11. 局部内部类和匿名内部类的对比
  12. C语言 __cplusplus - C语言零基础入门教程
  13. mysql数据库中数据类型的长度
  14. rabbitmq接收不到消息_SpringBoot2.x系列教程63--SpringBoot整合消息队列之RabbitMQ详解
  15. 让一个软件系统同时支持多个多种数据库灵活配置,让客户可以任意配置各个核心数据库部分...
  16. python安装成功之后教程_python安装教程 Pycharm安装详细教程
  17. 基于ADS54J40的JESD204B ADC 1GHz采样逻辑开发笔记
  18. Anaconda安装python模块
  19. BC26通过LWM2M接入电信AEP平台(透传模式)
  20. 用git和github来拉近和大牛的距离-郭永峰-专题视频课程

热门文章

  1. ffplay分析 (视频从Frame(解码后)队列取数据到SDL输出)
  2. SPI通信原理---STM32F4--HAL
  3. 《C++ Primer 第五版》(第5.1-5.6节) ——异常处理机制(try语句块,throw表达式和catch异常捕捉处理单元)
  4. hwt字体转换ttf_五分钟教你弄懂了字体反爬是个啥
  5. 每日一题:leetcode989.数组形式的整数加法
  6. 计算机网络【3】网络层
  7. linux syslog服务器配置,自动发日志到另一台日志服务器
  8. CSS的三种定位,成功入职字节跳动
  9. 美团点评APP在移动网络性能优化的实践,赶快收藏备战金九银十!
  10. 这么香的技术还不快点学起来,不吃透都对不起自己