`

使用yanf4j写个简单聊天室

    博客分类:
  • java
阅读更多

yanf4j 简介,请看这里
    这里俺要介绍下用yanf4j写个最简单的聊天室,可以直接telnet上去聊天。请先下载common-loggingyanf4j-0.40-stable-bin.tar.gz
    聊天室嘛,肯定要维护一个聊天者聊表:

<!---->List < Session >  sessionList  =  new CopyOnWriteArrayList < Session > ();

    用户名让系统产生,用户1、2、3.....,最简单的嘛:

<!---->AtomicInteger userId  =  new AtomicInteger();
private String generateUserName() {
        
return   " user "   +  userId.incrementAndGet();
    }

   
    服务端要实现一个处理handler,来接受用户连接并转发聊天消息,嗯,继承HandlerAdapter,覆写相应的方法即可。当有人连上来的时候,覆写onSessionCreated方法:

<!---->public   void  onSessionCreated(Session session) {
        sessionList.add(session);
        
//  给session取名
        session.attach(generateUserName());
        
//  广播某人进来
        broadcast(session, session.attachment()  +   "  enter room " );
    }

    当收到聊天消息的时候,广播给组内成员:

<!---->    @Override
    
public   void  onReceive(Session session, String t) {
        
if  (t.equals( " quit " ))
            session.close();
        
else
            broadcast(session, 
" [ "   +  session.attachment()  +   " ] say: "   +  t);

    }
    
private   void  broadcast(Session s, String msg) {
        
for  (Session session :  this .sessionList) {
            session.send(msg);
        }
    }


    广播我们只是简单的遍历sessionList并send而已。完整的ChatServerHandler.java清单如下:

<!---->package  com.google.code.yanf4j.test.example.chat;

import  java.util.List;
import  java.util.concurrent.CopyOnWriteArrayList;
import  java.util.concurrent.atomic.AtomicInteger;

import  com.google.code.yanf4j.nio.Session;
import  com.google.code.yanf4j.nio.impl.HandlerAdapter;

public   class  ChatServerHandler  extends  HandlerAdapter < String >  {
    List
< Session >  sessionList  =   new  CopyOnWriteArrayList < Session > ();
    AtomicInteger userId 
=   new  AtomicInteger();

   
@Override
    
public  void  onReceive(Session session, String t) {
        
if  (t.equals( " quit " ))
            session.close();
        
else
            broadcast(session, 
" [ "  +  session.attachment()  +  " ] say: "  +  t);

    }


    @Override
    
public   void  onSessionClosed(Session session) {
        sessionList.remove(session);
        broadcast(session, session.attachment() 
+   "  leave room " );
    }

    
private   void  broadcast(Session s, String msg) {
        
for  (Session session :  this .sessionList) {
            session.send(msg);
        }
    }

    @Override
    
public   void  onSessionCreated(Session session) {
        sessionList.add(session);
        
//  给session取名
        session.attach(generateUserName());
        
//  广播某人进来
        broadcast(session, session.attachment()  +   "  enter room " );
    }

    
private  String generateUserName() {
        
return   " user "   +  userId.incrementAndGet();
    }

}


    接下来我们要实现聊天服务器了,yanf4j实现TCP Server的核心类是TCPController,假设端口设为8080:

<!---->package  com.google.code.yanf4j.test.example.chat;

import  java.io.IOException;

import  com.google.code.yanf4j.config.Configuration;
import  com.google.code.yanf4j.nio.TCPController;
import  com.google.code.yanf4j.nio.impl.StringCodecFactory;

public   class  ChatServer {
    
public   static   void  main(String[] args)  throws  IOException {
        TCPController controller 
=   new  TCPController( new  Configuration(),
                
new  StringCodecFactory());
        controller.setHandler(
new  ChatServerHandler());
        controller.setPort(
8080 );   // 端口
        controller.start();   // 启动
    }
}


     顺利完成,启动后,telnet到8080端口,看看效果


分享到:
评论

相关推荐

    Xmemcached一个java实现的分布式缓存

    4. **使用示例** 创建一个简单的Xmemcached客户端实例: ```java import net.rubyeye.xmemcached.MemcachedClient; import net.rubyeye.xmemcached.XMemcachedClientBuilder; public class XmemcachedExample ...

    xmemcached 中文开发手册

    1.2.5版之后,yanf4j已经被整合入XMemcached本身,无需额外依赖。 #### 使用指南 - **依赖包**:XMemcached依赖于SLF4J日志框架。 - 对于使用Maven构建项目的用户,可以通过简单的依赖声明(如上述示例)轻松集成...

    xmemcached-1.2.4源码

    It's nio based (using my opensource nio framework :yanf4j), and was carefully tuned to get top performance. homepage: http://code.google.com/p/xmemcached/ downloads; ...

    Xmemcached用户指南

    - **基于Yanf4j框架**:XMemcached基于Java NIO框架Yanf4j构建,具有清晰的结构和良好的分层设计,易于扩展和定制。 #### 三、使用指南 **3.1 简单示例** 为了帮助读者更好地理解XMemcached的基本使用方法,下面...

    淘宝gecko框架设计.pdf

    Gecko基于yanf4j(Yet another nio framework for java)构建,这是一个Reactor+Handler模式的NIO框架。框架的主要组件包括: - **Controller**:控制接口,负责启动、管理、停止框架,并与业务代码交互。 - **...

    Xmemcached用户指南.docx

    9. **可扩展性**:基于yanf4j框架,XMemcached的架构清晰,易于扩展和维护。 **使用指南** 开始使用XMemcached,首先需要创建一个`XMemcachedClientBuilder`实例,并指定Memcached服务器的地址。例如,若服务器IP...

    memcached客户端和服务端程序和jar包

    import com.google.code.yanf4j.config.Configuration; import net.rubyeye.xmemcached.MemcachedClient; // 初始化客户端 Configuration conf = new Configuration("localhost:11211"); MemcachedClient client = ...

    Xmemcached用户指南.pdf

    9. **可扩展性**:基于yanf4j NIO框架,代码结构清晰,易于扩展和定制。 **使用指南** 开始使用XMemcached,首先需要构建MemcachedClient实例,如以下示例所示: ```java MemcachedClientBuilder builder = new ...

    《模式识别与人工智能》参与主办的第19期自动化前沿论坛召开.pdf

    [17]HUGS,YANF,CHANCH等人的工作涉及使用统一的三维形态模型进行面部识别。这些研究不仅展示了模式识别与人工智能领域的深度技术应用,也揭示了当前研究的发展趋势,例如三维模型构建、面部识别、图像编辑等。 此外...

    Yet Another News Fetcher-开源

    Yanf打开一个配置文件,对其进行读取,从其上的站点中获取新闻,然后将其放在类似于slashdot的网页中。 它支持Slashdot,Freshmeat。 32bitsonline,Segfault,Packetstorm,Linuxtelephony,Linuxtoday,Ufie,RDF...

    Foobar2000 简体中文版 全球最好的音乐播放器

    同时,有一个活跃的用户社区,提供插件开发和使用交流,使软件始终保持活力。 总结来说,Foobar2000凭借其卓越的音质、丰富的自定义选项和强大的功能,成为了许多音乐爱好者的首选播放器。无论是对于无损音乐的追求...

    batik-all-1.8.jar

    免费分享。

Global site tag (gtag.js) - Google Analytics