package com.kkoolerter.service;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IChatClient extends Remote {
public String getUserName()throws RemoteException;
public void sendMessage(String msg)throws RemoteException;
}
远程接口:
package com.kkoolerter.service;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IChatService extends Remote{
public void addClient(IChatClient client,String msg)throws RemoteException;
public void removeClient(IChatClient client,String msg)throws RemoteException;
public void sendMessage(IChatClient clientm,String msg)throws RemoteException;
}
package com.kkoolerter.service;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import javax.swing.JFrame;
public class ChatClient extends JFrame implements IChatClient, ActionListener {
private static final long serialVersionUID = 2950857379461851268L;
private String title;
private String user;
private IChatService chatService;
private TextField serverName;
private TextField serverPort;
private TextField userName;
private TextField message;
private Button send;
private TextArea fromServer;
private boolean connected = false;
private Button connect;
private Button disconnect;
public ChatClient(String str) {
super(str);
System.setSecurityManager(new RMISecurityManager());
setBounds(50, 20, 350, 400);
setLayout(new FlowLayout(FlowLayout.CENTER, 25, 10));
title = str;
setStatus();
add(new Label("Chat Server:"));
serverName = new TextField(20);
serverName.setText("localhost");
serverName.setEnabled(false);
add(serverName);
add(new Label("Server Port:"));
serverPort = new TextField(20);
serverPort.setText("1099");
serverPort.setEnabled(false);
add(serverPort);
add(new Label("User Name:"));
userName = new TextField(20);
userName.setText("");
add(userName);
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, 40);
add(fromServer);
try {
UnicastRemoteObject.exportObject(this);
} catch (Exception e) {
e.printStackTrace();
}
setVisible(true);
}
private void connect() {
try {
chatService = (IChatService) Naming
.lookup("rmi://localhost:1099/IChatService");
connected = true;
setStatus();
user = userName.getText().trim();
chatService.addClient(this, user + "上线");
} catch (Exception e) {
fromServer.append("error connection.\n");
e.printStackTrace();
connected = false;
setStatus();
chatService = null;
}
}
private void disconnect() {
try {
if (chatService == null) {
return;
}
chatService.removeClient(this, user + "下线");
chatService = null;
} catch (Exception e) {
fromServer.append("error disconnection.\n");
} finally {
connected = false;
setStatus();
}
}
private void setStatus() {
if (connected) {
setTitle(title + " connected");
} else {
setTitle(title + " disconnected");
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == connect) {
if (chatService == null) {
connect();
if (connected) {
userName.setEnabled(false);
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 (chatService == null) {
return;
}
try {
chatService.sendMessage(this, message.getText());
message.setText("");
} catch (Exception e2) {
fromServer.append("error sending message.\n");
e2.printStackTrace();
}
}
}
@Override
public void sendMessage(String msg) throws RemoteException {
fromServer.append(msg+"\n");
}
@Override
public String getUserName() throws RemoteException {
return user;
}
public static void main(String[] args) {
new ChatClient("hello");
}
}