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    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

json数据转换成表格_电子表格会让您失望吗? 将行数据转换为JSON树很容易。

json数据转换成表格Like many of you, I often have to take the result of SQL queries and convert the rowsets to JSON data objects. Sometimes I have to do the same with CSV files from spreadsheets. The transformation process can be a hassle, though anyone can…

mxm智能教育机器人无法智能对话_零代码使用腾讯TBP打造智能对话机器人

点击观看大咖分享心疼你独自一人承担生活的苦难&#xff0c;寂寞夜里陪伴你的只剩无人倾诉的压抑和无处安放的焦虑。养个宠物&#xff0c;它却不能get到你的“宠言宠语”。找个伴侣&#xff0c;还要浪费吵架的时间和精力。回到家里&#xff0c;只能浸泡在“循环唠叨式“母爱的沐…

MyGeneration代码生成工具

使用MyGeneration 生成代码&#xff1a;转自http://www.cnblogs.com/jack-liang/archive/2011/08/18/2144066.html我们经常用数据访问层和业务逻辑层&#xff0c;用MyGeneration就可以自动生成这些代码&#xff0c;我们可以不用手动写代码了。比如数据访问层&#xff0c;我们需…

数据库部分重点内容回顾

1.什么是聚集索引? 树形结构将数据组织和存储起来,起到加速查询的效果 2.主键索引怎么添加? (1)聚集索引(主键索引)的添加方式,创建时添加 方式一: Create table t1( id int primary key, ) 方式二: Create table t1( Id int, Primary key(id) ) (2)唯一索引创建时添加: 方式…

keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect

1.这里需要输入的密码不是证书的密码执行keytool -import -keystore - file 这个命令提示需要输入密码进入jdk的bin目录&#xff0c;执行以下脚本&#xff0c;keytool -import -alias saltapi -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre…

怎么更换锁定计算机的图片,Win10系统下怎样对锁定界面的背景图片进行更换

用户在唤醒睡眠状态的win10系统时&#xff0c;最先看到就是锁定界面。在界面中&#xff0c;一般有时间日期、星期几&#xff0c;及默认的背景图片。那么&#xff0c;win10系统锁定界面中的背景图片可以修改吗&#xff1f;下面&#xff0c;小编就给大家分享Win10系统更换锁定界面…

输电线路巡检机器人PPT_“高空大师”来了!架空输电线路智能巡检机器人在宁波投运...

“鄞州区220千伏天田4480线一切正常……”17日上午&#xff0c;随着一台智能巡检机器人稳稳地停靠在铁塔边&#xff0c;标志着我省首台架空输电线路智能巡检机器人在宁波率先投入运行&#xff0c;为电网安全运行请来了一位“高空大师”。近年来&#xff0c;无人机代替电力工人巡…

HDU 6325 Problem G. Interstellar Travel(凸包)

题意: 给你n个点,第一个点一定是(0,0)&#xff0c;最后一个点纵坐标yn一定是0&#xff0c;中间的点的横坐标一定都是在(0,xn)之间的 然后从第一个点开始飞行&#xff0c;每次飞到下一个点j&#xff0c;你花费的价值就是xi*yj-xj*yi&#xff0c;并且这里每一次飞行必须满足xi<…

UIView封装动画--iOS利用系统提供方法来做关键帧动画

iOS利用系统提供方法来做关键帧动画 ios7以后才有用。 /*关键帧动画options:UIViewKeyframeAnimationOptions类型*/[UIView animateKeyframesWithDuration:5.0 delay:0 options: UIViewAnimationOptionCurveLinear| UIViewAnimationOptionCurveLinear animations:^{//第二个关键…

JavaScript —从回调到异步/等待

JavaScript is synchronous. This means that it will execute your code block by order after hoisting. Before the code executes, var and function declarations are “hoisted” to the top of their scope.JavaScript是同步的。 这意味着它将在提升后按顺序执行代码块。…

关于解决工作中的自动化环境搭建的解决方案(序)

时间&#xff1a;2015~2017 之前的自动化搭建平台&#xff1a;robotest 安装工具&#xff1a;jdk1.8,robotest 这种工具反正超级好用&#xff0c;华为方搞得工具&#xff0c;前台操作超级傻瓜。会点xpatch&#xff0c;一些东西根本不在话下。但是坑爹的就是&#xff0c;出了外包…

xshell安装mysql步骤_mysql主从复制

前期提要&#xff1a;三年前双11买的阿里云今年到期了&#xff0c;win2012的&#xff0c;上面mysql数据库里记着自己的一些记账数据&#xff0c;上一年双11买了腾讯云的&#xff0c;centos7.7, 想学学MYSQL的复制功能&#xff0c;今天趁着无BUG可撸&#xff0c;试着配置了一下&…

大专学计算机维修,《计算机维修与网络工程》大专学历班

语文、数学、计算机英语、公文写作等办公自动化指法训练、英文打字、智能拼音及高速五笔字型中文打字、windows操作、Word2003文字处理软件、Excel2003电子表格、Powerpoint2003幻灯片制作、Internet网络的上网方法、浏览、下载、电子邮件收发等。本班学习完毕&#xff0c;可独…

webpack指定第三方模块的查找路径

通常我们会使用一些地方模块在我们的项目中&#xff0c;比如bootstrap import bootstrap 导入的bootstrap默认会查找当前目录的node_modules文件&#xff0c;但是如果这个文件没有&#xff0c;会依次往上级模块查找&#xff0c;直到到C盘的根目录为止&#xff0c;可以通过webpa…

我的第一个安卓应用程序_我如何设计我的第一个应用程序

我的第一个安卓应用程序by Daniel Novykov丹尼尔诺维科夫(Daniel Novykov) 我如何设计我的第一个应用程序 (How I Designed My First App) This is a story about building a product, what went wrong, and how it changed my career into Design.这是一个有关构建产品&#…

Appium——主从控制执行

1.客户端(Eclipse)机器A&#xff0c; 服务端(appium、Genymotion)机器B 2.设置Appium&#xff0c;Server Address为192.168.17.123&#xff0c;重新启动Appium 3.在客户端机器A浏览器中输入&#xff1a;http://192.168.17.123:4723/wd/hub&#xff0c; 说明配置成功。 JAVA代码…

Python学习-03(集合,文件,编码)

上周复习&#xff1a; 列表增删改查 元祖是可读列表 字符串操作 字典是无序的&#xff0c;通过key来找值。字典可以嵌套列表和字典 本周内容&#xff1a;集合--文件---字符编码 集合引入&#xff1a; #随机生成20个小于20的数&#xff0c;输出所有的数&#xff0c;# 要求重复…

安装centos7失败认不到硬盘_CentOS7 用U盘安装卡住无法进入安装界面解决方案

使用U盘安装Centos系统找不到U盘解决方案补充&#xff1a;1、制作U盘启动盘请参考&#xff1a;使用UltraISO(软碟通)制作ubuntu U盘启动盘如果你安装centos7出现了下图这种情况不用担心&#xff0c;是因为安装centos7时找不到U盘稍等一下&#xff0c;如下图等到出现命令行时。输…

Django横向二级导航栏(鼠标悬空事件)

1 <!DOCTYPE html>2 <html lang"en" xmlns"http://www.w3.org/1999/html">3 <head>4 <meta charset"UTF-8">5 <title>{% block title %} base模板 {% endblock title%}</title>6 <style >…

浙江大学计算机学院1702班,测控1702:传道授业解惑 此间师者真情

2017年9月11日晚8:00&#xff0c;电气与信息工程学院测控技术与仪器1702班在德智学生公寓的天台上开展了一场别开生面的班主任见面交流会。测控1702班班主任文一章博士、电气院2017级本科辅导员金晶老师以及测控1702班的同学们参加了此次见面会。测控1702班班主任文一章1991年出…