分享

python socket 多线程通讯

 看风景D人 2014-01-07
#!/usr/bin/evn python
"""
这是一个Socket+多进程的例子(聊天服务端)
2010年7月4日 by HK
转载请注明出处:http://www./
"""
 
import socket
import threading
 
# 处理中文数据用的
encoding = "GBK"
 
def HKServer(client, addr):
  """
  与客户端时实通讯函数
  加入encoding是为了处理输入中文数据
  client 客户socket
  addr   客户address
  """
 
  # 通知已有的每个客户,有新的成员加入
  for c in clients: c.send(bytes("[%s]加入\r\n" % addr[1], encoding))
 
  # 接受客户端数据
  say = b""
  while True:
    data = client.recv(1024)
    if not data: break
 
    # 如果不是回车键
    if data != b'\r\n':
      say += data #.encode(encoding)
      continue
 
    # 把客户端发来的内容发给所有的客户端
    for c in clients:
      c.send(bytes("[%s]:%s\r\n" % (addr[1], say.decode(encoding)), encoding))
 
    # 内容归\x0
    say = b""
 
  # 客户离开后,从客户列表中移队当前客户,关闭socket连接
  clients.remove(client)
  client.close()
 
  # 通知已有的每个客户,有成员离开
  for c in clients: c.send(bytes("[%s]离开\r\n" % addr[1], encoding))
 
 
# 客户端列表
clients = []
 
# 设置IP地址与端口
HOST = ''
PORT = 9999
 
# 初始化socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
# 绑定IP地址与端口
s.bind((HOST, PORT))
 
# 开始监听
s.listen(1)
 
# 循环等待
while True:
  # 接受客户
  client, addr = s.accept()
 
  # 启动新的进程与客户通信
  thread = threading.Thread(target=HKServer, args=(client, addr))
  thread.start()
 
  # 记录新的客户
  clients.append(client)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约