利用RMI技术开发聊天案例(尚有疑问,待解决!!!)
2014-04-29 23:21
246 查看
接口文件:IChatClient.java
接口文件:IChatService.java:
服务 类:ChatService.java
ChatServer.java :
ChatClient.java :
package com.cjq.rmi.inter; import java.rmi.Remote; import java.rmi.RemoteException; public interface IChatClient extends Remote { //获取客户名 public String getName() throws RemoteException; //广播新加入聊天者 public void sendMessage(String msg) throws RemoteException; }
接口文件:IChatService.java:
package com.cjq.rmi.inter; import java.rmi.Remote; import java.rmi.RemoteException; public interface IChatService extends Remote { //登录客户加入聊天室 public void addClient(IChatClient c,String msg) throws RemoteException; //向所有已进入的聊天者广播退出者 public void removeClient(IChatClient c,String msg) throws RemoteException; //将消息发送给所有当前的用户 public void sendMessage(IChatClient c,String msg) throws RemoteException; }
服务 类:ChatService.java
package com.cjq.rmi; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.util.Vector; import com.cjq.rmi.inter.IChatClient; import com.cjq.rmi.inter.IChatService; public class ChatService extends UnicastRemoteObject implements IChatService { Vector<IChatClient> clients; public ChatService() throws RemoteException{ super(); clients = new Vector<IChatClient>(); } @Override public void addClient(IChatClient c, String msg) throws RemoteException { System.out.println("Add Client entry....."); if(!clients.contains(c)){//此处if条件永真,为何?? for(int i=0;i<clients.size();i++){ sendMessage(clients.elementAt(i),msg); } // clients.addElement(c); clients.add(c); System.out.println("Add Client end....."); } } @Override public void removeClient(IChatClient c, String msg) throws RemoteException { System.out.println("Remove Client entry....."); if(clients.contains(c)){//此处为何c不属于clients?? for(int i =0;i<clients.size();i++){ sendMessage((IChatClient)clients.elementAt(i),msg); } clients.remove(c); System.out.println("Remove Client end....."); } } @Override public void sendMessage(IChatClient c, String msg) throws RemoteException { if(!clients.contains(c)){ return; } for(int i =0;i<clients.size();i++){ String user = c.getName(); if(user==null || user.equals("")){ user = "anonymous"; } (clients.elementAt(i)).sendMessage(user+":"+msg); System.out.println(user+":"+msg); } } }
ChatServer.java :
package com.cjq.rmi; import java.rmi.Naming; import java.rmi.RMISecurityManager; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; public class ChatServer { public static void main(String[] args) throws RemoteException { // System.setSecurityManager(new RMISecurityManager()); LocateRegistry.createRegistry(1099); try{ ChatService service = new ChatService(); Naming.rebind("rmi://localhost/IChatService",service); System.out.println("Service Started"); }catch(Exception e){ e.printStackTrace(); } } }
ChatClient.java :
package com.cjq.rmi; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.Label; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.rmi.Naming; import java.rmi.RMISecurityManager; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.server.UnicastRemoteObject; import com.cjq.rmi.inter.IChatClient; import com.cjq.rmi.inter.IChatService; public class ChatClient extends Frame implements IChatClient, ActionListener { IChatService service = null; TextField servername,serverport,username; Button connect,disconnect; TextField message; Button send; TextArea fromserver; boolean connected = false; String title,user=""; public ChatClient(){ } public ChatClient(String str) { super(str); // System.setSecurityManager(new RMISecurityManager()); try { LocateRegistry.getRegistry(1099); } catch (RemoteException e1) { e1.printStackTrace(); } setBounds(50,20,400,400); setLayout(new FlowLayout(FlowLayout.CENTER,25,10)); title = str; setStatus(); add(new Label("Chat Server Name:")); servername = new TextField(20); servername.setEnabled(false); add(servername); servername.setText("localhost");; add(new Label("Chat Server Port:")); serverport = new TextField(20); serverport.setEnabled(false); add(serverport); serverport.setText("1099"); add(new Label("Your User Name :")); username = new TextField(20); add(username); username.setText(""); connect = new Button("Connect"); connect.addActionListener(this); add(connect); disconnect = new Button("Disconnect"); disconnect.addActionListener(this); add(disconnect); message = new TextField(30); add(message); send = new Button("Send"); send.addActionListener(this); add(send); fromserver = new TextArea(10,50); add(fromserver); fromserver.setEditable(false); // try{ // UnicastRemoteObject.exportObject(this); // }catch(RemoteException e){ // e.printStackTrace(); // } setVisible(true); this.setLocationRelativeTo(null); } private void connect(){ try{ service = (IChatService)Naming.lookup("rmi://localhost/IChatService"); connected = true; setStatus(); user = username.getText().trim(); service.addClient(this, user+"连入");//this1... }catch(Exception e){ fromserver.append("Err Connecting ...\n"); connected = false; setStatus(); service = null; e.printStackTrace(); } } private void disconnect(){ try{ if(service ==null){ return; } service.removeClient(this, user+"退出");//this2. 实际this1不等于this2。 //因此导致无法remove Client,具体如何remove,待解决 //TODO service = null; }catch(Exception e){ fromserver.append("Error Disconnecting ...\n"); }finally{ connected = false; setStatus(); } } private void setStatus(){ if(connected){ setTitle(title+": Connected"); }else{ setTitle(title+": Not connected"); } } public String getName(){ return user; } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==connect){ connect(); if(connected){ username.setEnabled(true); connect.setEnabled(false); } }else if(e.getSource()==disconnect){ disconnect(); servername.setEnabled(true); serverport.setEnabled(true); username.setEnabled(true); connect.setEnabled(true); }else if(e.getSource()==send){ if(service==null){ return; } try{ service.sendMessage(this, message.getText()); // fromserver.append(getName()+":"+message.getText()+"\n"); message.setText(""); }catch(RemoteException ee){ ee.printStackTrace(); fromserver.append("Error Sending Message...\n"); } } } @Override public void sendMessage(String msg) throws RemoteException { fromserver.append(msg+"\n"); System.out.println(msg); } public static void main(String[] args) { ChatClient client = new ChatClient("Chat Client"); } }
相关文章推荐
- 利用RMI技术开发聊天案例(尚有疑问,待解决!!!)
- 如何利用虚拟化技术解决物联网开发难题?从了解 ACRN 开始
- 如何利用虚拟化技术解决物联网开发难题?从了解 ACRN 开始
- 敏捷开发案例:用白板解决项目管理和团队沟通
- 谷歌工程师利用和语言翻译类似的技术开发出了一个用于翻译图片主题的机器学习算法
- Android开发中常见的内存泄露案例以及解决方法总结
- iOS开发之隐藏tabbar--解决隐藏后依然不能响应对应位置事件的问题 分类: ios技术 2015-04-21 11:24 261人阅读 评论(0) 收藏
- 远程通讯之rmi开发案例2---用spring3实现rmi功能
- 关于公交系统中运用NFC-TSM技术进行移动支付的解决案例浅析
- 一个想法:成立草根技术联盟对开发人员进行技术定级解决企业员工招聘难问题!
- 利用AJAX技术开发应用程序实战
- C#开发AutoCad,利用ObjectDbx技术在当前dwg文件中插入其它未打开的dwg文件中的图块
- 【iOS开发-68】APP下载案例:利用tableView自带的cell布局+缓存池cell复用时注意button状态的检查
- Android_3D游戏开发技术详解与典型案例(附源码)
- 利用了相对坐标解决了商城项目开发中的一个问题。
- 【51CTO技术论坛】Android应用程序开发 实用案例50则
- 利用Shell开发跳板机功能脚本案例
- 利用netBeans开发JSP+javaBeans总是出错问题的解决