莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          使用yanf4j寫個簡單聊天室

          Posted on 2008-11-26 11:36 dennis 閱讀(2212) 評論(8)  編輯  收藏 所屬分類: 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端口,看看效果




          評論

          # re: 使用yanf4j寫個簡單聊天室  回復  更多評論   

          2008-11-26 13:00 by Arbow
          說到網絡編程的事情,最近我比較對LUA感興趣,想教教我小表弟用它來做簡單的網絡編程。
          爪哇之類的語言,雖然相比C++語法簡單不少,但是對初哥還是難了些,LUA簡明的語法還是蠻好懂的

          # re: 使用yanf4j寫個簡單聊天室  回復  更多評論   

          2008-11-26 13:07 by dennis
          @Arbow
          那你應該用ruby寫個dsl,更好懂

          # re: 使用yanf4j寫個簡單聊天室  回復  更多評論   

          2008-11-26 16:00 by mackson@vip.qq.com
          沒調試成功!能把項目出來看看嗎,

          # re: 使用yanf4j寫個簡單聊天室  回復  更多評論   

          2008-11-26 17:46 by dennis
          @mackson@vip.qq.com
          你可能沒有放common-logging的jar包

          # re: 使用yanf4j寫個簡單聊天室  回復  更多評論   

          2008-11-27 12:52 by homer
          你好厲害阿,以后多向你請教請教哦

          # re: 使用yanf4j寫個簡單聊天室  回復  更多評論   

          2008-12-01 00:23 by dennis
          @homer
          不敢當,我菜鳥一個,多謝關注

          # re: 使用yanf4j寫個簡單聊天室  回復  更多評論   

          2009-02-18 18:03 by 菜鳥問道
          偶這幾月對編程產生了業余興趣,聽說java很厲害,就學它了。語法書已經看過二本了,還行。聽說牛人都是寫框架的,路過此地看見先生的yanf4j,很好奇,下載看幾天,每個類的基本思路總算搞懂了,但是整個框架的總體思路卻怎么也看不明白,能否請先生談一下,畫個框架圖之類,讓我弄個明白?

          學 一下寫框架的思路,也好讓我這個菜鳥寫個框架,雷到那些大牛人。。

          # re: 使用yanf4j寫個簡單聊天室  回復  更多評論   

          2009-02-18 23:21 by dennis
          @菜鳥問道
          不敢當,有空會畫一個類圖結構
          主站蜘蛛池模板: 阿拉善盟| 印江| 兰西县| 礼泉县| 莲花县| 读书| 惠安县| 桑植县| 开阳县| 乌鲁木齐县| 临江市| 沂水县| 邓州市| 商城县| 西华县| 合肥市| 朔州市| 朝阳县| 丰原市| 青铜峡市| 南木林县| 昭平县| 九台市| 楚雄市| 红安县| 中西区| 大埔县| 定州市| 上饶县| 洛川县| 遂昌县| 丹棱县| 阜新| 松溪县| 双流县| 泸水县| 易门县| 萨迦县| 新源县| 苗栗县| 谢通门县|