RMI 聊天 的问题

转载 2007年10月01日 22:25:00

修改了一下,应该可以运行了,先贴代码,个别有中文乱码自己改改把,不影响运行。  
  1、ServerForChatInterface.java  
   
    import   java.rmi.Remote;  
    import   java.rmi.RemoteException;  
   
    public   interface   ServerForChatInterface   extends   Remote  
    {  
          void   regist(ChatViewerInterface   client)   throws   RemoteException;  
          void   chat(String   msg)   throws   RemoteException;  
      }  
   
  2、ServerForChat.java  
   
  import   java.rmi.*;  
    import   java.rmi.server.*;  
    import   java.util.Vector;  
    import   java.rmi.registry.*;  
   
    public   class   ServerForChat   extends   UnicastRemoteObject   implements   ServerForChatInterface  
    {  
          private   static   Vector   clients   =   new   Vector();  
          private   int   port   =   1099;  
          public   ServerForChat()   throws   RemoteException  
          {  
    super();  
            }  
          public   ServerForChat(int   port)   throws   RemoteException  
          {  
    super(port);  
    this.port   =   port;  
            }  
          public   void   regist(ChatViewerInterface   client)  
          {  
    if(clients.contains(client)==false)  
    {  
          clients.add(client);  
      }  
            }  
          public   void   chat(String   msg)  
          {  
    for(int   i   =   0;i<clients.size();i++)  
    {  
          try{  
      ((ChatViewerInterface)(clients.elementAt(i))).appendChatContent(msg);  
                  }catch(Exception   e){  
                  clients.remove(i);  
                  continue;  
                }  
      }  
            }  
          public   static   void   main(String   args[])  
          {  
    int   port   =   1099;  
    if(args!=null&&args.length==1)  
    {  
          try{  
      port   =   Integer.parseInt(args[0]);  
                  }catch(Exception   e){}  
      }  
    try{  
              LocateRegistry.createRegistry(port);  
              ServerForChat   server   =   new   ServerForChat(port);  
              Naming.rebind("rmi://127.0.0.1:"+port+"/ChatServer",server);  
            }catch(Exception   e){  
          System.out.println("start   sever   fail...");  
          System.exit(0);  
          }  
    System.out.println("server   started   on   port:   "+port);  
            }  
      }  
   
  3、ChatViewerInterface.java  
   
  import   java.rmi.Remote;  
  import   java.rmi.RemoteException;  
   
  public   interface   ChatViewerInterface   extends   Remote  
  {  
          void   appendChatContent(String   msg)   throws   RemoteException;  
    }  
   
  4、ChatViewer.java  
   
  import   java.rmi.*;  
  import   java.rmi.server.*;  
  import   javax.swing.*;  
  import   java.io.*;  
  import   javax.swing.text.*;  
  import   javax.swing.text.html.*;  
  import   javax.swing.event.*;  
  import   java.text.*;  
  import   java.awt.*;  
   
  public   class   ChatViewer   extends   JComponent   implements   ChatViewerInterface,Serializable  
  {  
          JScrollPane   scrollpane;  
          JTextPane   viewer;  
          public   ChatViewer()  
          {  
    this.initializedComponent();  
            }  
          public   ChatViewer(String   inimsg)  
          {  
    this.initializedComponent();  
    this.viewer.setText(inimsg);  
            }  
          private   void   initializedComponent()  
          {  
           
    this.viewer   =   new   JTextPane();  
    this.viewer.setContentType("text/html;charset=gb2312");  
    this.viewer.setEditable(false);  
    this.viewer.addHyperlinkListener(new   LinkListener());    
    this.scrollpane   =   new   JScrollPane(this.viewer);  
    this.setLayout(new   BorderLayout());  
    this.add(this.scrollpane,BorderLayout.CENTER);  
    this.setVisible(true);  
     
            }  
          public   void   appendChatContent(String   msg)  
          {  
    HTMLEditorKit   kit   =   (HTMLEditorKit)(this.viewer.getEditorKit());  
    Document   doc   =   this.viewer.getDocument();  
    StringReader   reader   =   new   StringReader(msg);  
    try{  
      kit.read(reader,doc,doc.getLength());          
      }catch(Exception   e){System.out.println("chat   content   /""+msg+"/"   lost..");}  
   
    if(this.viewer.getSelectedText()==null||this.viewer.getSelectedText().trim().length()==0)  
    {        
      this.viewer.select(this.viewer.getText().length(),this.viewer.getText().length());  
      }  
            }  
          public   void   sendToServer()  
          {  
    try{  
            UnicastRemoteObject.exportObject((ChatViewerInterface)this);  
            }catch(Exception   e){  
                        System.out.println("send   object   to   server   error:   "+e.getMessage());  
                        }  
            }  
  class   LinkListener   implements   HyperlinkListener  
  {  
          public   void   hyperlinkUpdate(HyperlinkEvent   e)  
          {                
              if(e.getEventType()   ==   HyperlinkEvent.EventType.ACTIVATED)  
              {                      
    if(e   instanceof   HTMLFrameHyperlinkEvent)  
    {    
        HTMLFrameHyperlinkEvent   evt   =   (HTMLFrameHyperlinkEvent)e;  
        HTMLDocument   doc   =   (HTMLDocument)(viewer.getDocument());    
        doc.processHTMLFrameHyperlinkEvent(evt);  
    }  
    else  
    {    
          try   {  
          Runtime.getRuntime().exec("explorer   "+e.getURL());                              
        }  
        catch(Exception   ioe)     {  
            //MessageDialog.showMessage(null,INFORMATION,UNSUPPORTED_BROWSER);  
        }  
    }    
              }    
          }    
    }    
  }  
   
  5、ClientForm.java  
  import   java.awt.*;  
  import   java.awt.event.*;  
  import   javax.swing.*;  
  import   java.rmi.*;  
  import   java.rmi.server.*;  
   
  public   class   ClientForm   extends   JFrame  
  {  
          private   ChatViewer   chat;  
          private   JTextField   msgeditor;  
          private   JButton   msgsender;  
          private   Container   contentpane;  
          private   JPanel   panel;  
          private   ServerForChatInterface   server;  
   
          public   ClientForm(String   serveraddress,int   port)  
          {  
    super("简易聊天室");    
    System.out.println("connect   to   server...");  
    try{  
              this.server   =   (ServerForChatInterface)Naming.lookup("rmi://"+serveraddress+":"+port+"/ChatServer");  
            }catch(Exception   e){  
          System.out.println("不能连接到服务器.");  
          System.exit(0);  
          }  
    this.initializedComponent();  
    this.fireEvent();  
    this.registChatViewer();  
            }  
          private   void   initializedComponent()  
          {  
    this.chat   =   new   ChatViewer("<font   color='blue'>欢迎进入聊天室</font>");  
    this.msgeditor   =   new   JTextField();  
    this.msgsender   =   new   JButton("发送");  
    this.panel   =   new   JPanel();  
    this.panel.setLayout(new   BorderLayout());  
    this.panel.add(this.msgeditor,BorderLayout.CENTER);  
    this.panel.add(this.msgsender,BorderLayout.EAST);  
    this.contentpane   =   this.getContentPane();  
    this.contentpane.setLayout(new   BorderLayout());  
    this.contentpane.add(this.chat,BorderLayout.CENTER);  
    this.contentpane.add(this.panel,BorderLayout.SOUTH);  
    this.setSize(600,400);  
    this.setVisible(true);  
            }  
          private   void   fireEvent()  
          {  
                  MessageSender   ms   =   new   MessageSender();  
    this.msgeditor.addActionListener(ms);  
    this.msgsender.addActionListener(ms);  
    this.msgeditor.grabFocus();  
            }  
          private   void   chat()  
          {  
    String   msg   =   this.msgeditor.getText();  
    this.msgeditor.setText("");  
    try{  
            this.server.chat(msg);  
            }catch(Exception   e){  
          this.chat.appendChatContent("<font   color='red'><b>发送消息失败,请检查网络.</b></font>");  
          }  
            }  
          private   void   registChatViewer()  
          {  
    try{  
            UnicastRemoteObject.exportObject((ChatViewerInterface)(this.chat));  
            this.server.regist((ChatViewerInterface)(this.chat));  
            }catch(Exception   e){  
          this.chat.appendChatContent("<font   color='red'><b>连接服务器失败,请检查网络.</b></font>");  
          }  
            }  
          class   MessageSender   implements   ActionListener  
          {  
    public   void   actionPerformed(ActionEvent   e)  
    {  
            chat();  
      }  
            }  
          public   static   void   main(String   args[])  
          {  
                String   serveraddress   =   "127.0.0.1";  
                int   port   =   1099;  
                if(args!=null&&args.length==2)  
                {  
                      serveraddress   =   args[0];  
        try{  
                  port   =   Integer.parseInt(args[1]);  
                }catch(Exception   e){}  
                  }  
                ClientForm   client   =   new   ClientForm(serveraddress,port);  
            }  
    }   
 

再说运行:  
  首先先将所有java程序放在一个目录下  
  如:  
  d:/rmitest  
   
  然后进入cmd,并到d:/rmitest目录下,然后运行:  
  d:/rmitest/javac   *.java  
  d:/rmitest>rmic   -v1.2   ChatViewer  
  d:/rmitest>rmic   -v1.2   ServerForChat  
  d:/rmitest>java   ServerForChat   1099  
  这时服务端就可以运行了  
   
  为了运行客户端,可以直接执行  
  d:/rmitest>java   ClientForm  
   
  为了将服务和客户分开,或者想在另外的机器上运行,则将以下class拷贝到其他目录或者计算机中:  
  ChatViewerInterface.class  
  ServerForChatInterface.class  
  ClientForm.class  
  ClientForm$MessageSender.class  
  ChatViewer.class  
  ChatViewer$LinkListener.class  
  ChatViewer_Stub.class  
  ServerForChat_Stub.class  
   
  例如拷入  
  d:/rmiclient  
  然后运行  
  d:/rmiclient>java   ClientForm   
 

还有个端口和远程访问的问题  
  此程序默认端口为1099  
  所以  
  d:/rmitest>java   ServerForChat   1099  
  和  
  d:/rmitest>java   ServerForChat  
  是等价的  
   
  此时客户端:  
  d:/rmiclient>java   ClientForm  
  和  
  d:/rmiclient>java   ClientForm   127.0.0.1   1099  
  也是等价的  
   
  可以自己设定端口,如  
  d:/rmitest>java   ServerForChat   10001  
  此时客户端需:  
  d:/rmiclient>java   ClientForm   127.0.0.1   10001  
   
  如果是远程访问,只要将  
  d:/rmiclient>java   ClientForm   127.0.0.1   10001  
  中的127.0.0.1改为服务器地址就可以了。   

 

按照d:/rmitest>rmic   -v1.2   ChatViewer  
  d:/rmitest>rmic   -v1.2   ServerForChat  
  d:/rmitest>java   ServerForChat   1099  
  然后在客户端运行  
  d:/rmiclient>java   ClientForm   ipaddress   port    
  就可以了
   

先将所有的java程序考在一个目录下  
  如:d:/rmitest  
   
  然后进入dos下键入以下命令:  
  d:/rmitest>javac   *.java  
  d:/rmitest>rmic   -v1.2   ChatViewer  
  d:/rmitest>rmic   -v1.2   ServerForChat  
  d:/rmitest>java   ServerForChat   1099  
  d:/rmitest>java   ClientForm  

chatting room

  • 2010年03月03日 21:29
  • 17KB
  • 下载

基于JAVA RMI的聊天室

  • 2011年02月24日 15:03
  • 39KB
  • 下载

用RMI实现一个简单的实时聊天系统(java语言)

 实现一个RMI应用程序(实验报告)㈠实验内容实现一个简单的实时聊天系统。㈡处理流程1、系统设计①    创建回调接口定义一个回调接口,服务器端可以回调此接口中声明的方法。该接口必须继承远程接口即Re...
  • yanw1986
  • yanw1986
  • 2009年11月04日 10:29
  • 968

RMI Server 多网卡问题

    问题描述: 当服务器端存在多网卡的时候,需要指定RMI Server对应的IP地址,否则可能存在RMI客户端找不到正确的RMI服务的情况。    通过设置java.rmi.server.ho...
  • wusekong
  • wusekong
  • 2010年12月22日 20:10
  • 1833

RMI穿越防火墙

RMI我接触算是比较早的了,研究生论文里阐述的项目,底层通信机制采用的就是RMI。当时还特意把RMI的规范翻译过来了,其实我上两届的师兄毕业论文几乎就是RMI的规范,当时RMI还是刚出现没有多久,作为...
  • dream8062
  • dream8062
  • 2011年12月06日 17:34
  • 1699

Spring RMI远程调用时的内外网端口映射问题

参考:http://blog.csdn.net/ktyl2000/article/details/4485896 实现:调用公网ip注册的远程对象    外网IP:x.x.x.102 port:9...
  • Edward_qing_Lee
  • Edward_qing_Lee
  • 2014年05月09日 16:36
  • 3058

RMI在外网不能通信的解决

前段时间写了一个全文检索服务,用的是RMI远程调用。在本机上写好后,测试ok.但一部署到服务器上就报找不到服务。在网上找了一大通: 原因如下:     RMI除了注册端口外,其通信端口是服务器...
  • wjrong_1
  • wjrong_1
  • 2015年12月12日 01:01
  • 1439

RMI运行常见问题及问题解决

转:http://blog.csdn.net/liumingkong/article/details/7039518 1,rmic命令 找不到内部或外部命令 解决方法: 在path环境变量中...
  • littlebeat123
  • littlebeat123
  • 2015年04月28日 11:56
  • 404

RMI 与 Netty对比

rmi 优势:面向对象的远程服务模型;基于TCP协议上的服务,执行速度快。 劣势:不能跨语言;每个远程对象都要绑定端口,不易维护;不支持分布式事务JTA,RMI框架对于安全性、事务、可扩展性的支持...
  • zhanglin911
  • zhanglin911
  • 2014年05月26日 13:17
  • 4612

RMI和socket详解

详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp58   一般来说,基于CS(client-server)软件架构的开...
  • yemou_blog
  • yemou_blog
  • 2015年12月14日 11:17
  • 609
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RMI 聊天 的问题
举报原因:
原因补充:

(最多只允许输入30个字)