服务端
#!/usr/bin/python from socket import *
import sys
import os class Node(object):
def __init__(self,val,next = None):
self.val = val
self.next = next def do_login(s,H,msg,clientaddr):
msg = msg.split(' ')
msg[2] = '%s login....'%msg[1] p = Node(clientaddr)
q = H.next while q != None:
s.sendto(msg[2],q.val)
q = q.next p.next = H.next
H.next = p return def do_quit(s,H,msg,clientaddr):
msg = "%s log out..."%msg.split(' ')[1] p = H while p.next != None:
if p.next.val != clientaddr:
s.sendto(msg,p.next.val)
p = p.next else:
q = p.next
p.next = q.next return def do_chat(s,H,msg,clientaddr):
p = H.next
buf = "%s say %s"%(msg.split(' ')[1],msg.split(' ')[2]) while p != None:
if p.val != clientaddr:
s.sendto(buf,p.val)
p = p.next return def do_parent(s,addr):
#msg = type + name + text
msg = "B server " while True:
print "system message >>"
text = sys.stdin.readline()
msg = msg + text
s.sendto(msg,addr)
s.close() def do_child(s):
H = Node(None) while True:
msg,clientaddr = s.recvfrom(4096)
tmp = msg.split(' ') if tmp[0] == 'L':
do_login(s,H,msg,clientaddr)
if tmp[0] == 'B':
do_chat(s,H,msg,clientaddr)
if tmp[0] == 'Q':
do_quit(s,H,msg,clientaddr) return def main():
HOST = sys.argv[1]
PORT = int(sys.argv[2])
ADDR = (HOST,PORT) s = socket(AF_INET,SOCK_DGRAM,0)
s.bind(ADDR) pid = os.fork() if pid < 0:
print "fail to create process"
return
elif pid == 0:
do_child(s)
else:
do_parent(s,ADDR) if __name__ == "__main__":
main()
 #客户端
#!/usr/bin/python from socket import *
import sys
from signal import *
import os def do_child(s,addr,msg):
name = msg.split(' ')[1]
while True:
text = raw_input(">>") if text == 'quit':
msg = 'Q ' + name
s.sendto(msg,addr)
os.kill(os.getppid(),SIGKILL)
exit()
else:
msg = 'B %s %s'%(name,text)
s.sendto(msg,addr)
return def do_parent(s):
while True:
msg,addr = s.recvfrom(2048)
print msg def main():
HOST = sys.argv[1]
PORT = int(sys.argv[2])
ADDR = (HOST,PORT) s = socket(AF_INET,SOCK_DGRAM,0) name = raw_input("please input your name>>") msg = 'L %s '%name s.sendto(msg,ADDR) pid = os.fork() if pid < 0:
print "fail to create process"
return
elif pid == 0:
do_child(s,ADDR,msg)
else:
do_parent(s) if __name__ == "__main__":
main()

python-fork聊天室的更多相关文章

  1. python socket 聊天室

    socket 发送的时候,使用的是全双工的形式,不是半双工的形式.全双工就是类似于电话,可以一直通信.并且,在发送后,如果又接受数据,那么在这个接受到数据之前,整个过程是不会停止的.会进行堵塞,堵塞就 ...

  2. python 实现聊天室

    所用模块 asyncore 官方介绍, 源码 英文捉鸡点 这里  源码中可以看到其实本质上就对 select 以及 socket 的进一步封装 简单说明 Python的asyncore模块提供了以异步 ...

  3. Python socket聊天室程序

    http://blog.csdn.net/calling_wisdom/article/details/42524745 今天用python的socket模块实现了一个聊天室的程序 虽然功能比较简单, ...

  4. Python 简单聊天室

    #coding=utf-8 from socket import * from threading import Thread import time udpSocket = socket(AF_IN ...

  5. 基于select的python聊天室程序

    python网络编程具体参考<python select网络编程详细介绍>. 在python中,select函数是一个对底层操作系统的直接访问的接口.它用来监控sockets.files和 ...

  6. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  7. Python聊天室

    小编心语:锵锵锵!各位看官注意了啊,走过路过表错过!上篇博文主要介绍了基于基于Server-Sent Event的简单在线聊天室,相信不管各位是大牛.小牛还是跟小编一样的小白,可能觉得看得不够过瘾,区 ...

  8. python tornado websocket 多聊天室(返回消息给部分连接者)

    python tornado 构建多个聊天室, 多个聊天室之间相互独立, 实现服务器端将消息返回给相应的部分客户端! chatHome.py // 服务器端, 渲染主页 --> 聊天室建立web ...

  9. 小小聊天室 Python实现

    相对于Java方式的聊天室,Python同样可以做得到.而且可以做的更加的优雅.想必少了那么多的各种流的Python Socket,你一定会喜欢的. 至于知识点相关的内容,这里就不多说了. UDP方式 ...

  10. 如何用Python编写一个聊天室

    一.课程介绍 1.简介 本次项目课是实现简单聊天室程序的服务器端和客户端. 2.知识点 服务器端涉及到asyncore.asynchat和socket这几个模块,客户端用到了telnetlib.wx. ...

随机推荐

  1. 试题 C: 数列求值 蓝桥杯

    试题 C: 数列求值本题总分: 10 分[问题描述]给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和.求第 20190324 项的最后 4 位数字.[ ...

  2. FIREDAC(DELPHI10 or 10.1)提交数据给ORACLE数据库的一个不是BUG的BUG

    发现FIREDAC(DELPHI10 or 10.1)提交数据给ORACLE数据库的一个不是BUG的BUG,提交的表名大小写是敏感的. 只要有一个表名字母的大小写不匹配,ORACLE就会认为是一个不认 ...

  3. struts2拦截器demo

    按照网上的一些资料配置的,期间也出现过几个错误. 其中有个错误,是关于struts.xml里面package配置的问题,因为里面的几个标签是有顺序的. 顺序是: result-types interc ...

  4. 如何为SharePoint文档库、文件夹、文件单独设置权限

    在这里使用截图的方式简单描述两个问题:设置SharePoint Server文档库权限和文档库中的文件夹权限 一.设置SharePoint Server文档库权限 Figure 1 - 打开文档库后, ...

  5. sqlserver数据库存储汉字出现?

    问题:有些相对复杂的汉字在数据库里会变成? 解决办法:原来数据类型是varchar,将数据类型修改为nvarchar

  6. Android实现表单提交,webapi接收

    1.服务端采用的是.net的WEBAPI接口. 2.android多文件上传. 以下为核心代码: package com.example.my.androidupload; import androi ...

  7. C#Encoding

    1.Encoding (1).如何生成一个Encoding即一种编码 Encoding位于System.Text命名空间下,是一个抽象类,它的派生类如下图: 要实例化一个Encoding一共有以下两种 ...

  8. 回去看linux的指令2

    SYNC CL : MSM8953 @ CL#:12212299 PROJECT PATH : // Platform / N / NILE / COMBINATION / MSM8953 Cross ...

  9. ASPNETPager常用属性(近来用到分页属性)

    ASPNETPager常用属性 建议去封装好,然后调用这样比较容易 <webdiyer:aspnetpager id="AspNetPager1" runat="s ...

  10. 部署LVS-DR群集

    一.LVS-DR原理剖析 (一)LVS-DR数据包流向分析 1.Client向目标VIP发出请求,Director(负载均衡器)接收.此时IP包头及数据帧头信息为: 2.Director根据负载均衡算 ...