chat.java

来自「JGRoups源码」· Java 代码 · 共 304 行

JAVA
304
字号
package org.jgroups.demos;import org.jgroups.*;import org.jgroups.util.Util;import org.jgroups.blocks.PullPushAdapter;import javax.swing.*;import java.awt.*;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;import java.util.LinkedList;import java.util.Iterator;import java.io.*;/** * Simple chat demo * @author Bela Ban * @version $Id: Chat.java,v 1.15 2006/09/27 19:21:54 vlada Exp $ */public class Chat implements MouseListener, WindowListener, ExtendedMessageListener, ExtendedMembershipListener {    Channel channel;    PullPushAdapter ad;    Thread mainThread;    final String group_name="ChatGroup";    String props=null;    Frame mainFrame;    TextArea ta;    TextField tf;    Label csLabel;    JButton leaveButton;    JButton sendButton;    JButton clearButton;    String username=null;    LinkedList history=new LinkedList();    public Chat(String props) {        this.props=props;        try {            username=System.getProperty("user.name");        }        catch(Throwable t) {}    }    public static void main(String[] args) {        String props=null;        for(int i=0; i < args.length; i++) {            if("-props".equals(args[i])) {                props=args[++i];                continue;            }            help();            return;        }        Chat chat=new Chat(props);        chat.start();    }    static void help() {        System.out.println("Chat [-help] [-props <properties>]");    }    public void start() {        mainFrame=new Frame();        mainFrame.setLayout(null);        mainFrame.setSize(600, 507);        mainFrame.addWindowListener(this);        ta=new TextArea();        ta.setBounds(12, 36, 550, 348);        ta.setEditable(false);        mainFrame.add(ta);        tf=new TextField();        tf.setBounds(100, 392, 400, 30);        mainFrame.add(tf);        csLabel=new Label("Send:");        csLabel.setBounds(12, 392, 85, 30);        mainFrame.add(csLabel);        leaveButton=new JButton("Leave");        leaveButton.setBounds(12, 428, 150, 30);        leaveButton.addMouseListener(this);        mainFrame.add(leaveButton);        sendButton=new JButton("Send");        sendButton.setBounds(182, 428, 150, 30);        sendButton.addMouseListener(this);        mainFrame.add(sendButton);        clearButton=new JButton("Clear");        clearButton.setBounds(340, 428, 150, 30);        clearButton.addMouseListener(this);        mainFrame.add(clearButton);        try {            channel=new JChannel(props);            channel.setOpt(Channel.AUTO_RECONNECT, Boolean.TRUE);            channel.setOpt(Channel.AUTO_GETSTATE, Boolean.TRUE);            channel.setOpt(Channel.BLOCK, Boolean.TRUE);            System.out.println("Connecting to " + group_name);            channel.connect(group_name);            ad=new PullPushAdapter(channel, this, this);            channel.getState(null, 5000);        }        catch(Exception e) {            ta.append(e.toString());        }        mainFrame.pack();        mainFrame.setLocation(15, 25);        mainFrame.setBounds(new Rectangle(580, 480));        mainFrame.setVisible(true);        mainFrame.show();        if(history.size() > 0) {            for(Iterator it=history.iterator(); it.hasNext();) {                String s=(String)it.next();                ta.append(s + "\n");            }        }    }    /* -------------------- Interface MessageListener ------------------- */    public void receive(Message msg) {        Object o;        try {            o=msg.getObject();            ta.append(o + " [" + msg.getSrc() + "]\n");            history.add(o);        }        catch(Exception e) {            ta.append("Chat.receive(): " + e);        }    }        public byte[] getState(String state_id) {    	//partial state transfer not used		return null;	}        public byte[] getState() {        try {            return Util.objectToByteBuffer(history);        }        catch(Exception e) {            return null;        }    }    public void setState(byte[] state) {        try {            history=(LinkedList)Util.objectFromByteBuffer(state);        }        catch(Exception e) {            e.printStackTrace();        }    }        public void setState(String state_id, byte[] state) {    	//partial state transfer not used			}        public void getState(OutputStream os) {    	ObjectOutputStream oos =null;		try {			oos = new ObjectOutputStream(os);						oos.writeObject(history);   	    	oos.flush();		} catch (IOException e) {}  		finally		{			try {								oos.close();			} catch (IOException e) {				System.err.println(e);			}		}    }        public void setState(InputStream is) {    	ObjectInputStream ois = null;		try {						ois = new ObjectInputStream(is);			history = (LinkedList)ois.readObject();  		} catch (Exception e) {} 		finally		{			try {								ois.close();			} catch (IOException e) {				System.err.println(e);			}		}    }        public void getState(String state_id, OutputStream ostream) {		//partial state transfer not used			}	public void setState(String state_id, InputStream istream) {		//partial state transfer not used			}    /* ----------------- End of Interface MessageListener --------------- */    /* ------------------- Interface MembershipListener ----------------- */    public void viewAccepted(View new_view) {        ta.append("Received view " + new_view + '\n');    }    public void suspect(Address suspected_mbr) {    }    public void block() {          }    public void unblock() {         }    /* --------------- End of Interface MembershipListener -------------- */    private synchronized void handleLeave() {        try {            System.out.print("Stopping PullPushAdapter");            ad.stop();            System.out.println(" -- done");            System.out.print("Disconnecting the channel");            channel.disconnect();            System.out.println(" -- done");            System.out.print("Closing the channel");            channel.close();            System.out.println(" -- done");            System.exit(0);        }        catch(Exception e) {            e.printStackTrace();            ta.append("Failed leaving the group: " + e.toString() + '\n');        }    }    private void handleSend() {        try {            Message msg=new Message(null, null, username + ": " + tf.getText());            channel.send(msg);        }        catch(Exception e) {            ta.append("Failed sending message: " + e.toString() + '\n');        }    }    public void mouseClicked(MouseEvent e) {        Object obj=e.getSource();        if(obj == leaveButton)            handleLeave();        else if(obj == sendButton)                handleSend();        else if(obj == clearButton)            ta.setText("");    }    public void mouseEntered(MouseEvent e) {}    public void mouseExited(MouseEvent e) {}    public void mousePressed(MouseEvent e) {}    public void mouseReleased(MouseEvent e) {}    public void windowActivated(WindowEvent e) {}    public void windowClosed(WindowEvent e) {}    public void windowClosing(WindowEvent e) { System.exit(0); }    public void windowDeactivated(WindowEvent e) {}    public void windowDeiconified(WindowEvent e) {}    public void windowIconified(WindowEvent e) {}    public void windowOpened(WindowEvent e) {}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?