通过参考其他牛人的文章和代码,  再根据自己的理解总结得出,  说明已经加在注释中, 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. android之ffmpeg:设置cygwin

    开发android ndk 的时候需要一个编译工具编译c程序,ndk需要linux下编译,所以win环境下提供Cygwin模拟linux编译C android-ndk 较低版本的这个工具的配置网上很多 ...

  2. java代码---charAt()和toCharry()的用法

    总结:charAt()是返回字符型,把字符串拆分成某个字符,返回指定位置的字符.可以把字符串看成char型数组 package com.sads; ///输出一个大写英文字母的 public clas ...

  3. json-lib使用笔记

    今天再来记录一款生成JSON的工具——json-lib,它比较与我之前使用的FastJSON来说,使用都是很简单的,但是要使用json-lib要需要的jar包可真不少,所需要的依赖jar有八九个之多, ...

  4. SCI 美国《科学引文索引》(Science Citation Index, 简称 SCI )

    科学引文索引 编辑锁定同义词SCI(科学引文索引)一般指科学引文索引   美国<科学引文索引>(Science Citation Index, 简称 SCI )于1957 年由美国科学信息 ...

  5. OD 实验(二十一) - 对反调试程序的逆向分析(二)

    程序: 运行程序 点击“Verify” 关闭该程序,启动 OD 再运行程序 逆向: 用 OD 载入程序 按 F8 往下走 执行完这个 call 指令就弹出了对话框 这个 call 指令调用了 Dial ...

  6. cinder backup ceph的配置和使用

    Backup 是将 volume 备份到别的地方(备份设备),将来可以通过 restore 操作恢复. 初看 backup 功能好像与 snapshot 很相似,都可以保存 volume 的当前状态, ...

  7. HTTP接口开发专题三(发送http请求,调用http接口的流程)

    一.xml数据格式传输 1)构造xml参数:通过JAXB将java对象转换为xml 2)调用上一篇的http工具类的方法,发送请求到目的接口地址 3)返回的xml字符串结果,用JAXB进行解析成jav ...

  8. jq循环方法

    jq在前台使用很广泛,其中不可避免会用到循环,for循环可以,但有时不方便,下边举两个jq循环: 第一个: $.each(数组或对象,function(index,item){ //循环的逻辑代码 } ...

  9. axis客户端循环访问webservice的时候只发送了几条数据就断开了的问题

    原因 axis客户端访问webservice默认是使用http1.0版本的,这个版本的http不能保持长连接,应该换成http1.1版本 具体修改步骤: <?xml version=" ...

  10. 复制新增树状数据_ParentID也需要更新

    CREATE TABLE TreeShip(  [ID] uniqueidentifier PRIMARY KEY NOT NULL,  [Name] [nvarchar](50) NULL,  [R ...