Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 321|回复: 0

[JavaIO学习]java NIO 聊天室练习程序

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-2 23:58:22 | 显示全部楼层 |阅读模式
    客户端程序:(其它程序请下载!!)
    1. package com.tcl.chat;
    2. import java.io.BufferedReader;
    3. import java.io.IOException;
    4. import java.io.InputStreamReader;
    5. import java.net.InetSocketAddress;
    6. import java.nio.ByteBuffer;
    7. import java.nio.channels.SocketChannel;
    8. import java.util.logging.Level;
    9. import java.util.logging.Logger;
    10. import com.tcl.chat.impl.ChatRecordStorageImpl;
    11. public class ChatClient implements Runnable{
    12.         private Logger log = Logger.getLogger(ChatClient.class.getName());
    13.     SocketChannel mChannel;
    14.     boolean bRunFlag = true;
    15.     private boolean bIsInit = false;
    16.     String mHostname;
    17.     int  mPort;
    18.    
    19.     private ChatRecordStorage mChatStorage = new ChatRecordStorageImpl();
    20.    
    21.     public ChatClient(String host,int port){
    22.             mHostname = host;
    23.             mPort = port;
    24.     }
    25.     private static final int TRY_TIMES = 3;
    26.         public void init() throws IOException{
    27.                         mChannel =  SocketChannel.open();
    28.                         mChannel.configureBlocking(false);  
    29.                         mChannel.connect(new InetSocketAddress(mHostname,mPort));
    30.                         int i = 0;
    31.                         boolean error = false;
    32.                         while (!mChannel.finishConnect() ) {
    33.                                 if (i >= TRY_TIMES) {
    34.                                         error = true;
    35.                                         break;
    36.                                 }
    37.                                 i++;
    38.                                 //
    39.                                 try {
    40.                                         Thread.sleep(200);
    41.                                 } catch (InterruptedException e) {
    42.                                         // TODO Auto-generated catch block
    43.                                         e.printStackTrace();
    44.                                 }
    45.                         }
    46.                         if (error) {
    47.                                 throw new IOException("连接错误,稍后再试");
    48.                         }
    49.                         bIsInit = true;
    50.         }
    51.        
    52.         @Override
    53.         public void run() {
    54.                 try {
    55.                         init();
    56.                        
    57.                 } catch (IOException e) {
    58.                         e.printStackTrace();
    59.                         System.exit(0);
    60.                 }
    61.                 if (!bIsInit) {
    62.                         throw new RuntimeException("not init");
    63.                 }
    64.                 ByteBuffer buffer = ByteBuffer.allocate(1024);
    65.                 KeyBordReader kbr = new KeyBordReader();
    66.                 new Thread(kbr).start();//阻塞方式的读
    67.                
    68.                 while (bRunFlag) {
    69.                         buffer.clear();
    70.                         StringBuffer sb = new StringBuffer();
    71.                         int num;
    72.                         try {
    73.                                 Thread.sleep(500);
    74.                                 while((num = mChannel.read(buffer)) > 0){
    75.                                         sb.append(new String(buffer.array(),0,num));
    76.                                         buffer.clear();
    77.                                 }
    78.                                 if (sb.length() > 0 ) {
    79.                                         log.log(Level.INFO,"Client Recerive:" + sb.toString());
    80.                                 }
    81.                                 if (sb.toString().toLowerCase().trim().equals("bye")) {
    82.                                         mChannel.close();
    83.                                         kbr.close();
    84.                                         bRunFlag = false;
    85.                                         System.exit(0); //退出
    86.                                 }
    87.                         } catch (IOException e) {
    88.                                 // TODO Auto-generated catch block
    89.                                 e.printStackTrace();
    90.                         } catch (InterruptedException e) {
    91.                                 // TODO Auto-generated catch block
    92.                                 e.printStackTrace();
    93.                         }
    94.                        
    95.                 }
    96.         }
    97.         public static void main(String[] args) {
    98.                 int port = 10003;
    99.                 new Thread(new ChatClient("localhost", port)).start();
    100.         }
    101.        
    102.         class KeyBordReader implements Runnable{
    103.                 public KeyBordReader(){
    104.                        
    105.                 }
    106.                 private boolean bRunFlag = true;
    107.                 public void close(){
    108.                         bRunFlag = false;
    109.                 }
    110.                 @Override
    111.                 public void run() {
    112.                         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    113.                         while (this.bRunFlag) {
    114.                                 //System.out.println(TIP);
    115.                                 try {
    116.                                         String str = reader.readLine().trim();
    117.                                         if (str == null) {
    118.                                                 continue;
    119.                                         }
    120.                                         if (!str.startsWith("@")) {
    121.                                                 System.out.println("must begin with @");
    122.                                                 continue;
    123.                                         }else if (str.equals("@help")) {
    124.                                                 System.out.println(TIP);
    125.                                         }else if (str.equals("@exit")) {
    126.                                                 System.exit(0);
    127.                                         }
    128.                                         mChannel.write(ByteBuffer.wrap(str.getBytes()));
    129.                                 } catch (IOException e) {
    130.                                         // TODO Auto-generated catch block
    131.                                         e.printStackTrace();
    132.                                 }
    133.                                
    134.                         }
    135.                 }
    136.                
    137.         }
    138.         private static String TIP = ""
    139.                                                 + "@pub to send public message
    140. "
    141.                                                 + "@xxx to send private message
    142. "
    143.                                                 + "@exit to exit client
    144. "
    145.                                                 + "@quit to quit from server
    146. "
    147.                                                 + "@listmember to list members";
    148.                        
    149. }
    复制代码

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/2/235821640.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 16:20 , Processed in 0.290775 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表