用JGROUPS实现的简单聊天室

package com.runway.booster.jgroups;

import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Iterator; import java.util.LinkedList; import java.util.List;

import org.jgroups.JChannel; import org.jgroups.Message; import org.jgroups.ReceiverAdapter; import org.jgroups.View; import org.jgroups.util.Util;

public class SimpleChat extends ReceiverAdapter {     JChannel channel;     String user_name=System.getProperty("user.name", "n/a");     final List state=new LinkedList();     public static final String DEFAULT_PROTOCOL_STACK=         "UDP(mcast_addr=228.1.2.3;mcast_port=45566;ip_ttl=32):" +         "PING(timeout=3000;num_initial_members=6):" +         "FD(timeout=3000):" +         "VERIFY_SUSPECT(timeout=1500):" +         "pbcast.NAKACK(gc_lag=10;retransmit_timeout=600,1200,2400,4800):" +         "UNICAST(timeout=600,1200,2400,4800):" +         "pbcast.STABLE(desired_avg_gossip=10000):" +         "FRAG:" +         "pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;" +         "shun=true;print_local_addr=true):" +         "pbcast.STATE_TRANSFER";

    public void viewAccepted(View new_view) {         System.out.println("** view: " + new_view);     }

    public void receive(Message msg) {         String line=msg.getSrc() + ": " + msg.getObject();         System.out.println(line);         synchronized(state) {             state.add(line);         }     }

    public byte[] getState() {         synchronized(state) {             try {                 return Util.objectToByteBuffer(state);             }             catch(Exception e) {                 e.printStackTrace();                 return null;             }         }     }

    public void setState(byte[] new_state) {         try {             List list=(List)Util.objectFromByteBuffer(new_state);             synchronized(state) {                 state.clear();                 state.addAll(list);             }             System.out.println("received state (" + list.size() + " messages in chat history):");             for (Iterator it = list.iterator();it.hasNext();) {              System.out.println(it.next());             }             /*for(String str: list) {                 System.out.println(str);             }*/         }         catch(Exception e) {             e.printStackTrace();         }     }

    private void start() throws Exception {         channel=new JChannel(DEFAULT_PROTOCOL_STACK);         channel.setOpt(JChannel.GET_STATE_EVENTS, Boolean.TRUE);         channel.setReceiver(this);         channel.connect("ChatCluster");         channel.getState(null, 10000);         eventLoop();         channel.close();     }

    private void eventLoop() {         BufferedReader in=new BufferedReader(new InputStreamReader(System.in));         while(true) {             try {                 System.out.print("> "); //System.out.flush();                 String line=in.readLine().toLowerCase();                 if(line.startsWith("quit") || line.startsWith("exit")) {                     break;                 }                 line="[" + user_name + "] " + line;                 Message msg=new Message(null, null, line);                 channel.send(msg);                 Thread.sleep(10);             }             catch(Exception e) {             }         }     }

    public static void main(String[] args) throws Exception {         new SimpleChat().start();     } }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值