莊周夢(mèng)蝶

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

          使用yanf4j寫個(gè)簡單聊天室

          Posted on 2008-11-26 11:36 dennis 閱讀(2211) 評(píng)論(8)  編輯  收藏 所屬分類: java
              yanf4j簡介,請(qǐng)看這里
              這里俺要介紹下用yanf4j寫個(gè)最簡單的聊天室,可以直接telnet上去聊天。請(qǐng)先下載common-loggingyanf4j-0.40-stable-bin.tar.gz
              聊天室嘛,肯定要維護(hù)一個(gè)聊天者聊表:
          List<Session> sessionList = new CopyOnWriteArrayList<Session>();
              用戶名讓系統(tǒng)產(chǎn)生,用戶1、2、3.....,最簡單的嘛:
          AtomicInteger userId = new AtomicInteger();
          private String generateUserName() {
                  
          return "user" + userId.incrementAndGet();
              }
             
              服務(wù)端要實(shí)現(xiàn)一個(gè)處理handler,來接受用戶連接并轉(zhuǎn)發(fā)聊天消息,嗯,繼承HandlerAdapter,覆寫相應(yīng)的方法即可。當(dāng)有人連上來的時(shí)候,覆寫onSessionCreated方法:
          public void onSessionCreated(Session session) {
                  sessionList.add(session);
                  
          // 給session取名
                  session.attach(generateUserName());
                  
          // 廣播某人進(jìn)來
                  broadcast(session, session.attachment() + " enter room");
              }
              當(dāng)收到聊天消息的時(shí)候,廣播給組內(nèi)成員:
              @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());
                  
          // 廣播某人進(jìn)來
                  broadcast(session, session.attachment() + " enter room");
              }

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

          }

              接下來我們要實(shí)現(xiàn)聊天服務(wù)器了,yanf4j實(shí)現(xiàn)TCP Server的核心類是TCPController,假設(shè)端口設(shè)為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();  //啟動(dòng)
              }
          }

               順利完成,啟動(dòng)后,telnet到8080端口,看看效果




          評(píng)論

          # re: 使用yanf4j寫個(gè)簡單聊天室  回復(fù)  更多評(píng)論   

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

          # re: 使用yanf4j寫個(gè)簡單聊天室  回復(fù)  更多評(píng)論   

          2008-11-26 13:07 by dennis
          @Arbow
          那你應(yīng)該用ruby寫個(gè)dsl,更好懂

          # re: 使用yanf4j寫個(gè)簡單聊天室  回復(fù)  更多評(píng)論   

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

          # re: 使用yanf4j寫個(gè)簡單聊天室  回復(fù)  更多評(píng)論   

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

          # re: 使用yanf4j寫個(gè)簡單聊天室  回復(fù)  更多評(píng)論   

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

          # re: 使用yanf4j寫個(gè)簡單聊天室  回復(fù)  更多評(píng)論   

          2008-12-01 00:23 by dennis
          @homer
          不敢當(dāng),我菜鳥一個(gè),多謝關(guān)注

          # re: 使用yanf4j寫個(gè)簡單聊天室  回復(fù)  更多評(píng)論   

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

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

          # re: 使用yanf4j寫個(gè)簡單聊天室  回復(fù)  更多評(píng)論   

          2009-02-18 23:21 by dennis
          @菜鳥問道
          不敢當(dāng),有空會(huì)畫一個(gè)類圖結(jié)構(gòu)
          主站蜘蛛池模板: 繁峙县| 兰坪| 黎城县| 沽源县| 乌拉特中旗| 信丰县| 娄烦县| 东乡县| 麻栗坡县| 肇东市| 青海省| 景洪市| 中山市| 清新县| 岳阳市| 尉犁县| 日喀则市| 琼结县| 从化市| 织金县| 札达县| 灌阳县| 德化县| 突泉县| 武邑县| 呼伦贝尔市| 石楼县| 兰州市| 建宁县| 磴口县| 成都市| 通州市| 保康县| 鞍山市| 马山县| 奇台县| 赤峰市| 明溪县| 广宁县| 武定县| 黑水县|