`
ghh0000
  • 浏览: 23724 次
  • 来自: ...
社区版块
存档分类
最新评论

简单聊天室

阅读更多
concurrence examples
#server
#chat.py
from concurrence import dispatch, Tasklet, Message
from concurrence.io import BufferedStream, Socket, Server

class MSG_WRITE_LINE(Message): pass
class MSG_QUIT(Message): pass
class MSG_LINE_READ(Message): pass

connected_clients = set() #set of currently connected clients (tasks)
        
def handle(client_socket):
    """handles a single client connected to the chat server"""
    stream = BufferedStream(client_socket)

    client_task = Tasklet.current() #this is the current task as started by server
    connected_clients.add(client_task)
    
    def writer():
        for msg, args, kwargs in Tasklet.receive():
            if msg.match(MSG_WRITE_LINE):
                stream.writer.write_bytes(args[0] + '\n')
                stream.writer.flush()
            
    def reader():
        for line in stream.reader.read_lines():
            line = line.strip()
            if line == 'quit': 
                MSG_QUIT.send(client_task)()
            else:
                MSG_LINE_READ.send(client_task)(line)
    
    reader_task = Tasklet.new(reader)()
    writer_task = Tasklet.new(writer)()

    MSG_WRITE_LINE.send(writer_task)("type 'quit' to exit..")
    
    for msg, args, kwargs in Tasklet.receive():
        print args[0]
        if msg.match(MSG_QUIT):
            break
        elif msg.match(MSG_LINE_READ):
            #a line was recv from our client, multicast it to the other clients
            for task in connected_clients:
                if task != client_task: #don't echo the line back to myself
                    MSG_WRITE_LINE.send(task)(args[0])
        elif msg.match(MSG_WRITE_LINE):
            MSG_WRITE_LINE.send(writer_task)(args[0])
        
    connected_clients.remove(client_task)
    reader_task.kill()
    writer_task.kill()
    client_socket.close()
           
def server():
    """accepts connections on a socket, and dispatches
    new tasks for handling the incoming requests"""
    print 'listening for connections on port 9010'
    Server.serve(('localhost', 9010), handle)

if __name__ == '__main__':
    dispatch(server)

#client
#client.py
# coding: UTF8

from concurrence.core import dispatch, Message, Tasklet
from concurrence.io.buffered import BufferedStream
from concurrence.io.socket import Socket

class MSG_SEND(Message): pass
class MSG_QUIT(Message): pass
class MSG_LINE_READ(Message): pass

def client():
    client_task = Tasklet.current()
    client_id = id(client_task)
    
    sock = Socket.connect(("localhost", 9010), 5)
    stream = BufferedStream(sock)
   
    def writer():
        for msg, args, _ in Tasklet.receive():
            try:
                if msg.match(MSG_SEND):
                    data = args[0]
                    
                    print "SEND:", data
                    stream.writer.write_bytes(data + '\n')
                    stream.writer.flush()
            except Exception, e:
                print "WREX:", e
                break
        MSG_QUIT.send(client_task)()
            
    def reader():
        while True:
            try:
                for line in stream.reader.read_lines():
                    line = line.strip()
                    MSG_LINE_READ.send(client_task)(line)
            except Exception, e:
                print "RDEX:", e
                break
        MSG_QUIT.send(client_task)()
        
    reader_task = Tasklet.new(reader)()
    writer_task = Tasklet.new(writer)()
    
    def send(data):
        MSG_SEND.send(client_task)(data)
        
    def process(data):
        print "RECV:", data
        
    def play_game():
        while True:
            send("hello")
            Tasklet.sleep(5)
                
    Tasklet.later(3, play_game)()

    for msg, args, _ in Tasklet.receive():
        if msg.match(MSG_LINE_READ):
            process(args[0])
        elif msg.match(MSG_SEND):
            MSG_SEND.send(writer_task)(args[0])
    
    print "close"
    reader_task.kill()
    writer_task.kill()
    sock.close()

if __name__ == '__main__':
    dispatch(client)

分享到:
评论

相关推荐

    新手学习简易聊天室

    【标题】:“新手学习简易聊天室” 这是一份专为初学者设计的简易聊天室项目,旨在帮助他们理解和掌握聊天室的基本构建与运作原理。在IT行业中,聊天室是一种常见的实时通讯应用,它允许用户之间进行实时的文字、...

    Java课程设计(简易聊天室)

    Java课程设计——简易聊天室 在Java编程领域,课程设计是学习过程中不可或缺的一部分,它旨在让学生将所学理论知识应用于实际项目中。本项目“Java课程设计(简易聊天室)”就是一个很好的实践案例,它涵盖了网络...

    基于nio的简易聊天室

    本项目"基于nio的简易聊天室"旨在通过NIO技术实现一个简单的聊天室服务端和客户端,其特点是有图形用户界面(GUI)供用户交互。 NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。在这...

    简易聊天室_聊天室_

    【简易聊天室_聊天室_】是一个实现两台主机间通信的应用程序,它允许用户通过互联网进行实时对话。这个项目的核心在于构建一个简单的聊天环境,让用户能够交换各种类型的数据,包括数字、字符、汉字和英文字母。在IT...

    简单聊天室简单聊天室简单聊天室C#

    【标题】:“简单聊天室简单聊天室简单聊天室C#” 【描述】:“一个简单的聊天室,基于webservice,采用C#编程语言实现。” 【标签】:“简单聊天室”、“简单”、“聊天室”、“聊天”、“C#” 在这个项目中,...

    超简易聊天室.(内置对象小实例)

    【标题】:“超简易聊天室.(内置对象小实例)”揭示了这是一个关于构建简单聊天室的编程示例,其中可能使用了特定的内置对象,如`APPLICATION`和`SESSION`,来实现用户间的实时交流功能。这两个对象在Web开发中扮演...

    简易聊天室

    (1)制作简易聊天室,能够实现简单的页面聊天功能。 (2)制作网页计数器,要求相同的窗口内刷新页面访问次数并不增加,并且用图片来显数字。1、 熟悉request、response、session、application、out等内置对象; 2、 ...

    基于AJAX的简易聊天室

    【基于AJAX的简易聊天室】是一个利用现代Web技术实现的实时交互平台,它整合了AJAX、JSP、Servlet和MySQL数据库等关键技术,旨在提供一个简洁高效的在线沟通环境。AJAX(Asynchronous JavaScript and XML)是核心,...

    Java写的简易聊天室

    总结起来,"Java写的简易聊天室"项目涵盖了以下关键知识点: 1. Java的Socket网络编程,包括 `ServerSocket` 和 `Socket` 类。 2. 客户端与服务器之间的连接建立和断开过程。 3. 使用线程处理客户端的并发连接。 4....

    基于c语言的简易聊天室

    本文将深入探讨如何基于C语言构建一个简易聊天室,这是一个非常实用的基础项目,可以帮助初学者更好地理解和掌握网络编程的基本概念。 首先,我们要了解的是TCP/IP协议族,它是互联网通信的基础。在C语言中,我们...

    .net简易聊天室系统

    《.NET简易聊天室系统详解》 在编程领域,C#是一种广泛使用的语言,尤其在.NET框架下,它为开发高效、稳定的应用程序提供了强大的支持。本篇文章将深入探讨一个基于C#实现的.NET简易聊天室系统,旨在帮助学习者理解...

    java简单聊天室源代码

    【Java简单聊天室源代码】是一个基于Java技术实现的简易聊天室项目,主要涉及的知识点包括Java编程语言、网络通信、多线程以及Web开发中的JSP(Java Server Pages)技术。下面将对这些关键知识点进行详细介绍。 1. ...

    简易聊天室 C语言源程序

    【简易聊天室 C语言源程序】是一个针对初学者设计的简单聊天室程序,它通过C语言实现,专注于群聊功能,适用于对聊天室编程感兴趣但经验不足的学生。在这个项目中,我们将探讨聊天室的基本原理、C语言编程技巧以及...

    简易聊天室(PHP+MySQL

    【简易聊天室(PHP+MySQL】是一个基于Web的实时交流平台,主要利用PHP作为服务器端脚本语言,配合MySQL数据库来存储用户信息和聊天记录。这个项目实现了几个关键功能,包括用户注册、发言、查看聊天记录、用户注销...

    java实现简易聊天室

    Java 实现简易聊天室 本文将对 Java 实现简易聊天室的设计和实现进行详细的分析和讲解。该聊天室程序主要由五个 Java 源文件组成,即 Server.java、Objecting.java、LogIn.java、ClientUser.java 和 Client.java。...

    简单聊天室(源码+文档)

    【简单聊天室】是一个基础的网络通信应用,它实现了客户端与服务端的实时通信功能,让用户可以进行多人在线聊天。这个项目主要运用了TCP/IP协议,确保数据在互联网中的可靠传输。下面将详细阐述该聊天室的核心知识点...

    Android简易版聊天室

    在本文中,我们将深入探讨如何构建一个简单的Android聊天室应用,以及它与PC服务器端和客户端的交互。这个"Android简易版聊天室"项目旨在提供一个基础架构,用于理解多平台间实时通信的工作原理。 首先,我们要理解...

    linux下的简易聊天室

    在Linux环境下创建一个简易聊天室是一项综合性的编程挑战,它涵盖了多个关键的技术领域。这个项目主要涉及以下几个核心知识点: 1. **Linux基本知识**:在Linux操作系统中开发应用程序,需要了解其文件系统、进程...

    ActiveMQ实战——实现一个简易版的聊天室

    在本篇《ActiveMQ实战——实现一个简易版的聊天室》中,我们将深入探讨如何利用Apache ActiveMQ构建一个简单的在线聊天应用。ActiveMQ是Apache软件基金会的一个开源项目,它是一款功能强大的消息中间件,用于在...

    C#简易聊天室

    ### C#简易聊天室开发详解 #### 一、项目背景与目标 本项目旨在通过创建一个基于C#和ASP.NET的简易聊天室,帮助学生掌握Web应用开发的基础知识和技术要点。该聊天室具备基本的聊天功能,并且能够利用数据库来管理...

Global site tag (gtag.js) - Google Analytics