<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    花開(kāi)有時(shí)

    花開(kāi)有時(shí),花落有時(shí),來(lái)有時(shí),去有時(shí)。不撕扯,只關(guān)切;不紀(jì)念,只牽掛;不感動(dòng),只明白;不尋找,只記得。
    隨筆 - 24, 文章 - 0, 評(píng)論 - 54, 引用 - 0
    數(shù)據(jù)加載中……

    使用SWT寫(xiě)一個(gè)基于JGroup的簡(jiǎn)單局域網(wǎng)聊天程序

      JGroup簡(jiǎn)要說(shuō)明:JGroup是一種可靠的群組通訊工具,用Java實(shí)現(xiàn)。JGroup以IP多播為基礎(chǔ)并且提供可靠性和群組功能。
      在JGroup中有一個(gè)Chat.java類(lèi),是基于Swing的一個(gè)簡(jiǎn)單的局域網(wǎng)聊天的例子。在這里我按照這個(gè)例子的把局域網(wǎng)聊天的功能用SWT實(shí)現(xiàn)。
      本以為不會(huì)出現(xiàn)什么問(wèn)題但是在實(shí)現(xiàn)的時(shí)候發(fā)現(xiàn)兩個(gè)同局域網(wǎng)的客戶端不能互連,找不到對(duì)方。在調(diào)試的時(shí)候發(fā)現(xiàn)只要是使用了SWT的類(lèi)的地方會(huì)出現(xiàn)線程錯(cuò)誤,于是我想是不是出現(xiàn)了線程同步的問(wèn)題。經(jīng)詢問(wèn)別人后得知在SWT中使用JGroup應(yīng)該要使線程同步,應(yīng)該使用Display類(lèi)的syncExec(Runnable r)方法。于是問(wèn)題解決(至于為什么,由于我對(duì)SWT的線程機(jī)制還不熟悉,暫時(shí)沒(méi)有深究)。
      JGroup使用麻煩的地方是它的配置,在這里我使用了它的默認(rèn)配置。在我程序里使用JGroup的默認(rèn)配置是足夠了,如果要寫(xiě)基于分布式或者比較復(fù)雜的網(wǎng)絡(luò)程序的話,則需要比較深入的知識(shí)。
      下面是代碼:
    package jgroup;

    import java.util.Calendar;
    import java.util.List;

    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.DisposeEvent;
    import org.eclipse.swt.events.DisposeListener;
    import org.eclipse.swt.events.KeyAdapter;
    import org.eclipse.swt.events.KeyEvent;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;
    import org.jgroups.Address;
    import org.jgroups.Channel;
    import org.jgroups.ChannelClosedException;
    import org.jgroups.ChannelException;
    import org.jgroups.ChannelNotConnectedException;
    import org.jgroups.JChannel;
    import org.jgroups.Message;
    import org.jgroups.View;
    import org.jgroups.blocks.MembershipListenerAdapter;
    import org.jgroups.blocks.MessageListenerAdapter;
    import org.jgroups.blocks.PullPushAdapter;

    public class IMTest4 {
        
    private Text text_getMessage;
        
    private Text text_sendMessage;
        
    private Button sendButton;
        
    private Button clearButton;
        
    private Shell shell;
        
    private Display display;

        
    private Channel channel;
        
    private PullPushAdapter ppa;
        
    private List<Address> list;
        
    private int memberNum;

        
    private String userName;

        
    public IMTest4() {
            
    try {
                channel 
    = new JChannel();
                channel.connect(
    this.getClass().getName());
            }
     catch (ChannelClosedException e) {
                e.printStackTrace();
            }
     catch (ChannelException e) {
                e.printStackTrace();
            }

        }


        
    public static void main(String[] args) {
            
    try {
                IMTest4 window 
    = new IMTest4();
                window.open();
            }
     catch (Exception e) {
                e.printStackTrace();
            }

        }


        
    public void open() {
            display 
    = Display.getDefault();
            createContents();
            shell.open();
            shell.layout();
            
    while (!shell.isDisposed()) {
                
    if (!display.readAndDispatch())
                    display.sleep();
            }

        }


        
    protected void createContents() {
            shell 
    = new Shell(SWT.MIN);
            
    final GridLayout gridLayout_1 = new GridLayout();
            gridLayout_1.makeColumnsEqualWidth 
    = true;
            shell.setLayout(gridLayout_1);
            shell.setSize(
    381275);
            shell.addDisposeListener(
    new IMTest4_DisposeListener());

            text_getMessage 
    = new Text(shell, SWT.V_SCROLL | SWT.READ_ONLY
                    
    | SWT.BORDER | SWT.WRAP);
            
    final GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true,
                    
    false);
            gridData.heightHint 
    = 135;
            text_getMessage.setLayoutData(gridData);

            text_sendMessage 
    = new Text(shell, SWT.V_SCROLL | SWT.BORDER | SWT.WRAP);
            
    final GridData gridData_1 = new GridData(SWT.FILL, SWT.CENTER, true,
                    
    false);
            gridData_1.heightHint 
    = 48;
            text_sendMessage.setLayoutData(gridData_1);
            text_sendMessage.setFocus();

            
    final Composite composite = new Composite(shell, SWT.NONE);
            
    final GridData gridData_2 = new GridData(SWT.RIGHT, SWT.CENTER, false,
                    
    false);
            gridData_2.heightHint 
    = 29;
            composite.setLayoutData(gridData_2);
            
    final GridLayout gridLayout = new GridLayout();
            gridLayout.marginRight 
    = 23;
            gridLayout.horizontalSpacing 
    = 20;
            gridLayout.numColumns 
    = 2;
            composite.setLayout(gridLayout);

            sendButton 
    = new Button(composite, SWT.NONE);
            sendButton.setToolTipText(
    "快捷鍵“Ctrl+Enter”");
            sendButton.setLayoutData(
    new GridData(60, SWT.DEFAULT));
            sendButton.setText(
    " 發(fā)  送 ");

            clearButton 
    = new Button(composite, SWT.NONE);
            clearButton.setLayoutData(
    new GridData(60, SWT.DEFAULT));
            clearButton.setText(
    " 清  除 ");

            sendButton.addSelectionListener(
    new IMTest4_SelectionAdapter());
            text_sendMessage.addKeyListener(
    new IMTest4_KeyAdapter());
            clearButton.addSelectionListener(
    new IMTest4_Clear_SelectionAdapter());

            ppa 
    = new PullPushAdapter(channel, new IMTest4_MessageListener(),
                    
    new IMTest4_MemberListener());
        }


        
    /**
         * 停止通信
         
    */

        
    private void stop() {
            System.out.print(
    "Stopping PullPushAdapter");
            ppa.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);
        }


        
    /**
         * 消息處理,處理成需要的格式:用戶名+發(fā)送消息的時(shí)間+消息
         * 
         * 
    @param m
         *            從text_sendMessage上獲得的消息
         * 
    @return
         
    */

        
    private String messageDispose(String m) {
            
    return userName + ": [" + Calendar.getInstance().getTime() + "]\n" + m
                    
    + "\n\n";
        }


        
    /**
         * 發(fā)消息
         
    */

        
    private void sendMessage() {
            IMUtil.checkSyncExec(display, 
    new Runnable() {
                
    public void run() {
                    
    for (int i = 0; i < list.size(); i++{
                        
    if (memberNum == i)
                            
    continue;
                        
    try {
                            channel.send(
    new Message(list.get(i), null,
                                    messageDispose(text_sendMessage.getText())));
                        }
     catch (ChannelNotConnectedException e) {
                            e.printStackTrace();
                        }
     catch (ChannelClosedException e) {
                            e.printStackTrace();
                        }

                    }

                    text_getMessage.append(messageDispose(text_sendMessage
                            .getText()));
                    text_sendMessage.setText(
    "");
                }

            }
    );
        }


        
    class IMTest4_DisposeListener implements DisposeListener {
            
    public void widgetDisposed(DisposeEvent e) {
                stop();
            }

        }


        
    class IMTest4_SelectionAdapter extends SelectionAdapter {
            @Override
            
    public void widgetSelected(SelectionEvent e) {
                sendMessage();
            }

        }


        
    class IMTest4_KeyAdapter extends KeyAdapter {
            @Override
            
    public void keyPressed(KeyEvent e) {
                
    if (e.stateMask == SWT.CTRL && e.keyCode == SWT.CR) {
                    sendMessage();
                    e.doit 
    = false;
                }

            }

        }


        
    class IMTest4_Clear_SelectionAdapter extends SelectionAdapter {
            @Override
            
    public void widgetSelected(SelectionEvent e) {
                text_getMessage.setText(
    "");
            }

        }


        
    class IMTest4_MessageListener extends MessageListenerAdapter {
            
    /**
             * 接收消息
             
    */

            
    public void receive(final Message msg) {
                IMUtil.checkSyncExec(display, 
    new Runnable() {
                    
    public void run() {
                        text_getMessage.append(msg.getObject().toString());
                    }

                }
    );
            }

        }


        
    class IMTest4_MemberListener extends MembershipListenerAdapter {
            @Override
            
    public void viewAccepted(View new_view) {
                list 
    = new_view.getMembers();
                memberNum 
    = list.indexOf(channel.getLocalAddress());
                userName 
    = System.getProperty("user.name"+ "_(" + memberNum + ")";
                IMUtil.checkSyncExec(display, 
    new Runnable() {
                    
    public void run() {
                        shell.setText(
    "IMTest4(" + memberNum + ")");//根據(jù)成員變化窗體的名字
                    }

                }
    );
            }

        }

    }


      工具類(lèi):
    package jgroup;

    import org.eclipse.swt.widgets.Display;

    public class IMUtil {
        
    public static Boolean checkSyncExec(Display display,Runnable r){
            
    if(!display.isDisposed()){
                display.syncExec(r);
                
    return true;            
            }

            
    else{
                
    return false;
            }

        }


    }

    posted on 2007-07-28 09:50 花開(kāi)有時(shí) 閱讀(3113) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): JGroup

    評(píng)論

    # re: 使用SWT寫(xiě)一個(gè)基于JGroup的簡(jiǎn)單局域網(wǎng)聊天程序  回復(fù)  更多評(píng)論   

    信息中文是亂碼
    2012-03-21 16:34 | zhz

    # re: 使用SWT寫(xiě)一個(gè)基于JGroup的簡(jiǎn)單局域網(wǎng)聊天程序  回復(fù)  更多評(píng)論   

    發(fā)個(gè)你用到的包?。?
    2014-11-24 12:07 | yang.xiang

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产亚洲人成网站观看| 久久精品乱子伦免费| 久久亚洲国产成人影院网站 | 亚洲高清国产拍精品青青草原| AAA日本高清在线播放免费观看| 国产精品成人啪精品视频免费| 又硬又粗又长又爽免费看| 一级毛片成人免费看a| 成人福利在线观看免费视频| 国产精品综合专区中文字幕免费播放 | 成人无码区免费视频观看| 欧美日韩国产免费一区二区三区| 国产成人免费在线| 亚洲国产AV无码一区二区三区| 亚洲午夜日韩高清一区| jlzzjlzz亚洲jzjzjz| 亚洲欧美一区二区三区日产| 19禁啪啪无遮挡免费网站| 亚洲Av无码乱码在线znlu| 亚洲综合一区二区精品久久| 在线亚洲v日韩v| 久久精品国产精品亚洲艾草网美妙 | 亚洲黄色免费在线观看| 久久久久久99av无码免费网站 | 亚洲av无码不卡私人影院| 久久精品国产精品亚洲艾 | 永久黄色免费网站| 精品亚洲一区二区| 福利片免费一区二区三区| 国产精品免费观看久久| 亚洲今日精彩视频| 一级特黄录像视频免费| 免费无码不卡视频在线观看| 亚洲精品美女在线观看| 免费无码又爽又刺激网站 | 国产亚洲精品线观看动态图| 亚洲精品无码中文久久字幕| 2021在线永久免费视频| 亚洲AV永久无码精品| yellow视频免费看| 免费人成网站在线播放|