通过参考其他牛人的文章和代码,  再根据自己的理解总结得出,  说明已经加在注释中, FYI

主要参考文章: http://blog.csdn.net/dk_zhe/article/details/37820965

        http://www.cnblogs.com/coser/archive/2012/01/06/2315216.html

        https://docs.python.org/2.7/library/select.html?highlight=select#module-select

        http://www.cnblogs.com/devinzhang/archive/2012/01/13/2321826.html

        http://blog.chinaunix.net/uid-23146151-id-3084687.html

server.py    和   client.py

#coding=utf-8
# 通过socket建立网络连接的步骤:
# 至少需要2个套接字, server和client
# 需要建立socket之间的连接, 通过连接来进行收发data
# client 和 server连接的过程:
# 1. 建立server的套接字,绑定主机和端口,并监听client的连接请求
# 2. client套接字根据server的地址发出连接请求, 连接到server的socket上; client socket需要提供自己的 socket fd,以便server socket回应
# 3. 当server监听到client连接请求时, 响应请求, 建立一个新的线程, 把server fd 发送给client
# 而后, server继续监听其他client请求, 而client和server通过socket连接互发data通信
import socket,select,thread host = socket.gethostname()
port = 5963
server_addr = (host,port) # waitable的read list, 表示异步通信中可读socket对象的列表
inputs = []
# 连接进入server的client的名称
fd_name = {} # 创建并初始化server socket
def serverInit():
ss = socket.socket() # 创建server socket
ss.bind(server_addr) # 绑定到server addr
ss.listen(10) # 监听端口号, 设置最大监听数10
return ss # 返回初始化后的server socket # 创建一个新的socket连接
def newConnection(ss):
client_conn,client_addr = ss.accept() # 响应一个client的连接请求, 建立一个连接,可以用来传输数据
try:
# 向client端发送欢迎信息
client_conn.send("welcome to chatroom,pls set up your nick name!")
client_name = client_conn.recv(1024) #接收client发来的昵称,最大接收字符为1024
inputs.append(client_conn)
fd_name[client_conn] = client_name # 将连接/连接名 加入键值对
client_conn.send("current members in chatroom are: %s" % fd_name.values())
# 向所有连接发送新成员加入信息
for other in fd_name.keys():
if other != client_conn and other != ss:
other.send(fd_name[client_conn]+" joined the chatroom!")
except Exception as e:
print e def closeConnection():
pass def run():
ss = serverInit()
inputs.append(ss)
print "server is running..."
while True:
# rlist,wlist,elist = select.select(inputs, [], inputs,100) # 如果只是服务器开启,100s之内没有client连接,则也会超时关闭
rlist,wlist,elist = select.select(inputs, [], [])
# 当没有可读fd时, 表示server错误,退出服务器
if not rlist:
print "timeout..."
ss.close() # 关闭 server socket
break
for r in rlist:
if r is ss: # server socket, 表示有新的client连接请求
newConnection(ss)
else: # 表示一个client连接上有数据到达服务器
disconnect = False
try:
data = r.recv(1024) #接收data
data = fd_name[r] + " : "+ data # 确定客户端昵称
except socket.error:
data = fd_name[r] + " leaved the room"
disconnect = True
else:
pass
if disconnect:
inputs.remove(r)
print data
for other in inputs:
if other != ss and other != r: #不发生到服务器和已经断开的连接
try:
other.send(data)
except Exception as e:
print e
else:
pass
# 除名
del fd_name[r]
else:
print data # 在服务器显示client发送的数据
# 向其他成员(连接)发送相同的信息
for other in inputs:
if other != ss and other != r:
try:
other.send(data)
except Exception as e:
print e
if __name__ == "__main__":
run()
#coding=utf-8
# 由于实验都在本机上运行, 所以server addr == client addr
import socket,select,threading,sys
host = socket.gethostname()
client_addr = (host,5963) # equals server_addr() # 倾听其他成员谈话
def listening(cs):
inputs = [cs]
while True:
rlist,wlist,elist = select.select(inputs, [], [])
# client socket就是用来收发数据的, 由于只有这个waitable 对象, 所以不必迭代
if cs in rlist:
try:
# 打印从服务器收到的数据
print cs.recv(1024)
except socket.error:
print "socket is error"
exit() # 发言
def speak(cs):
while True:
try:
data = raw_input()
except Exception as e:
print r"can't input"
exit()
# if data == "exit":
# cs.close()
# break
try:
cs.send(data)
except Exception as e:
exit() def main():
# client socket
cs = socket.socket()
cs.connect(client_addr)
# 分别启动听和说线程
t = threading.Thread(target=listening,args=(cs,)) # 注意当元组中只有一个元素的时候需要这样写, 否则会被认为是其原来的类型
t.start() t1 = threading.Thread(target=speak,args=(cs,))
t1.start() if __name__ == "__main__":
main()


-->

Python Socket实现简单的聊天室的更多相关文章

  1. python使用websocket简单组建聊天室

    server端 ###websocket_server### import socket import threading sock = socket.socket(socket.AF_INET, s ...

  2. WinForm的Socket实现简单的聊天室 IM

    1:什么是Socket 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象. 一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制. 从 ...

  3. 简单的聊天室代码php+swoole

    php swoole+websocket 客户端代码 <!DOCTYPE html> <html> <head> <title></title&g ...

  4. Android简单的聊天室开发(client与server沟通)

    请尊重他人的劳动成果.转载请注明出处:Android开发之简单的聊天室(client与server进行通信) 1. 预备知识:Tcp/IP协议与Socket TCP/IP 是Transmission ...

  5. Netty学习笔记(四) 简单的聊天室功能之服务端开发

    前面三个章节,我们使用了Netty实现了DISCARD丢弃服务和回复以及自定义编码解码,这篇博客,我们要用Netty实现简单的聊天室功能. Ps: 突然想起来大学里面有个课程实训,给予UDP还是TCP ...

  6. 玩转Node.js(四)-搭建简单的聊天室

    玩转Node.js(四)-搭建简单的聊天室 Nodejs好久没有跟进了,最近想用它搞一个聊天室,然后便偶遇了socket.io这个东东,说是可以用它来简单的实现实时双向的基于事件的通讯机制.我便看了一 ...

  7. 利用socket.io构建一个聊天室

    利用socket.io来构建一个聊天室,输入自己的id和消息,所有的访问用户都可以看到,类似于群聊. socket.io 这里只用来做一个简单的聊天室,官网也有例子,很容易就做出来了.其实主要用的东西 ...

  8. Express+Socket.IO 实现简易聊天室

    代码地址如下:http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: 首 ...

  9. Python实现网络多人聊天室

    网络多人聊天室 文件结构: chatroom ├── client.py  # 客户端代码 ├── language.py  # 语言文件 ├── server.py  # 服务端代码 └── set ...

随机推荐

  1. Hibernate学习8—Hibernate 映射关系(多对多)

    第二节:Hibernate 多对多映射关系实现   比如学生和课程是多对多的关系: 一个学生可以选多个课程: 一个课程可以被多个学生选中,所以是多对多的关系:   1,多对多单向实现: 单向关系: 这 ...

  2. 数据结构与算法JavaScript描述——列表

    1.列表的抽象数据类型定义   2.实现列表类: 2.1 append:给列表添加元素: 2.2 remove: 从列表中删除元素: 2.3 find方法: 2.4 length:列表中有多少个元素: ...

  3. 004:MySQL数据库体系结构

    目录 一. MySQL数据库体系结构 1.MySQL数据库体系结构介绍 1 数据库定义 2 数据库实例 2. MySQL体系结构 1 单进程多线程结构 2 存储引擎的概念 3 体系结构图 4 逻辑存储 ...

  4. Memory leak by misusing Autofac

    Recently I’ve found out that we can easily cause a memory leaks in our .net application by improper ...

  5. 在线pubmed

    ESearch(文本搜索) eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi http://eutils.ncbi.nlm.nih.gov/entr ...

  6. 13.solr学习速成之IK分词器

    IKAnalyzer简介 IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包. IKAnalyzer特性 a. 算法采用“正向迭代最细粒度切分算法”,支持细粒度和最大词长两 ...

  7. PHP memcache client封装

    config.inc.php $CONFIG_MEMCACHE['default'] = array( //'127.0.0.1:11211:100', '10.9.20.73:11211:100', ...

  8. Dijkstra算法的另一种证明

    按:今天看Tanenbaum的计算机网络时讲到了Dijkstra算法.关于算法的正确性,<算法导论>给出了严格的证明.CLRS的证明基于一个通用的框架,非常清晰.今天只是随意想想是否有其他 ...

  9. python十个博客

    1.首先第一个肯定是毋庸置疑的Planet Python这是最出名的python博客其中之一,快去看看,我希望你能找到对你有用的东西,昨天它还更新了呢! 2.第二个博客是lucumr,博主是flask ...

  10. java内存区域的分布

    读了<深入理解Java虚拟机>之后,当时理解了,过段时间又忘记了,在此做下记录,方便自我回顾,也希望能帮到想要学习虚拟机的同学. Java虚拟机在执行java程序时会把它所管理的内存分为5 ...