5. frame.setSize(500, 200);
frame.setResizable(false);
}
// Frame 2
public class Frame2 extends JFrame {
public Frame2() {
setTitle("Member Server P2");
setSize(500, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
// Start Server
private void startServer() {
String id = idField.getText();
String ip = ipField.getText();
int port = Integer.parseInt(portField.getText());
if (id.isEmpty() || ip.isEmpty() || port <= 0) {
statusLabel.setText("Please enter a valid ID, IP address, and port.");
return;
}
String uniqueId = UUID.randomUUID().toString();
statusLabel.setText("Server started with ID: " + uniqueId);
6. isRunning = true;
new Thread(new Runnable() {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(port);
while (isRunning) {
Socket socket = serverSocket.accept();
// process incoming connection from member
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String id = in.readLine();
String ip = socket.getInetAddress().getHostAddress();
int port = socket.getPort();
// add member to server
Member member = new Member(id, ip, port);
members.add(member);
System.out.println("Member " + id + "has joined the server");
}
} catch (IOException e) {
statusLabel.setText("Error starting server: " + e.getMessage());
}
}
}).start();
7. }
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
public class Server implements Subject {
private List<Member> members = new ArrayList<>();
private List<Observer> observers = new ArrayList<>();
private Member coordinator;
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.notifyUpdate();
}
8. }
public void addMember(Member member) {
if (members.isEmpty()) {
coordinator = member;
coordinator.informCoordinator();
} else {
member.receiveMembers(getMemberDetails());
broadcastMessage(member.getName() + " has joined the group.");
}
members.add(member);
notifyObservers();
}
public void removeMember(Member member) {
members.remove(member);
if (member.equals(coordinator)) {
coordinator = null;
electNewCoordinator();
notifyObservers();
}
broadcastMessage(member.getName() + " has left the group.");
}
private void electNewCoordinator() {
if (members.size() > 0) {
9. coordinator = members.get(0);
broadcastMessage(coordinator.getName() + " is now the new coordinator.");
coordinator.informCoordinator();
}
}
public List<Member> getMembers() {
return members;
}
private Map<String, MemberDetails> getMemberDetails() {
Map<String, MemberDetails> memberDetails = new HashMap<>();
for (Member member : members) {
memberDetails.put(member.getName(), new MemberDetails(member.getIpAddress(),
member.getPort()));
}
return memberDetails;
}
}
public void broadcastMessage(String message) {
for (Member member : members) {
member.receiveBroadcastMessage(message);
}
}
public void sendPrivateMessage(Member sender, String recipientName, String message) {
for (Member member : members) {
10. if (member.getName().equals(recipientName)) {
member.receivePrivateMessage(sender.getName(), message);
return;
}
}
}
public void handleUnresponsiveMember(Member member) {
members.remove(member);
broadcastMessage(member.getName() + " is unresponsive.");
}
}
public interface Observer {
void notifyUpdate();
}
// Setters and getters
public class Member implements Observer {
private String name;
private String ipAddress;
private int port;
private Server server;
public Member(String name, String ipAddress, int port) {
this.name = name;
this.ipAddress = ipAddress;
11. this.port = port;
}
@Override
public void notifyUpdate() {
System.out.println("The server has been updated.");
}
public void joinGroup(Server server) {
server.addMember(this);
}
public void leaveGroup(Server server) {
server.removeMember(this);
}
public void receiveMembers(Map<String, MemberDetails> memberDetails) {
members.clear();
members.addAll(memberDetails.values());
}
public void informCoordinator() {
System.out.println("I am the new coordinator.");
}
public void receiveBroadcastMessage(String message) {
System.out.println("[" + name + "] " + message);
}
public void receivePrivateMessage(String senderName, String message) {
12. System.out.println("[Private message from " + senderName + " to " + name + "] " + message);
}
public String getName() {
return name;
}
public String getIpAddress() {
return ipAddress;
}
public int getPort() {
return port;
}
}
class MemberDetails {
private String ipAddress;
private int port;
public MemberDetails(String ipAddress, int port) {
this.ipAddress = ipAddress;
this.port = port;
}
public String getIpAddress() {
return ipAddress;
}
public int getPort() {