分布式实验——选举实现

问题:编写自己的组播应用。编写一个应用使多个进程使用组通信完成选举。有两个候选人:John和Smith。每个进程通过一个标明自身身份及选票的消息组播自己的选票。每个进程跟踪每个候选人的得票数,也包括自己的得票情况。选举结束时(例如,John 10,Smith 5)。提交你的应用程序清单并回答下列问题:

(1)你的设计是如何允许参与者加入组播组的?

(2)你的设计是如何同步选举开始的,使得每个进程都准备就绪,等待接收组成员发出的任何选票?

在文件夹中创建一个send.txt把下面的内容复制进去,再把后缀改成java,在命令执行框中进行编译运行。

import java.io.*;
import java.net.*;
public class send {
	public static void main(String[] args) throws Exception {
		InetAddress group = InetAddress.getByName("239.1.2.3");
		int port = 8888;
		MulticastSocket socket = null;
		InputStreamReader is = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(is);
		String character = br.readLine();
		byte[] data = null;
		data = character.getBytes();
		DatagramPacket packet = new DatagramPacket(data, data.length, group,port);
		Thread theThread = new Thread(new ReadThread(group, port));
		theThread.start();
		System.out.println("Hit return when ready to send");
		br.readLine();
		socket = new MulticastSocket(port);
		socket.send(packet);
		socket.close();
	}
}
class ReadThread implements Runnable
{
	static final int MAX_LEN=30;
	private InetAddress group;
	private int port;
	int John=0;
	int Smith=0;
	public ReadThread(InetAddress group,int port)
	{
		this.group=group;
		this.port=port;
	}
	public void run()
	{
		try{
			MulticastSocket socket=new MulticastSocket(port);
			socket.joinGroup(group);
			while(true){
				byte[] data=new byte[MAX_LEN];
				DatagramPacket packet=new DatagramPacket(data,data.length,group,port);
				socket.receive(packet);
				String s=new String(packet.getData());
				s=s.substring(0, 4);
				if(s.equals("John"))
					System.out.println("John: "+ ++this.John+"\nSmith "+ this.Smith);
				else
					System.out.println("John: "+ this.John+"\nSmith "+ ++this.Smith);
			}
		}catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}

 找到你所创建的文件夹下输入javac send.java进行编译

编译完后,多打开几个命令执行框,进行投票,每一个执行框只能投一次

 

出现这个的时候按回车,投票成功

 

(1)你的设计是如何允许参与者加入组播组的?

程序在运行时,每开一个窗口就是一个参与者进行投票。参与者在投票时必须输入参选者的姓名和对应的投票(比如:John 0 Smith 1),每人最多只能投一票,每次投完票后会显示相应的投票结果。然后再打开另一个窗口,轮到下一个参与者进行投票,进行上述操作。重复以上过程直到最后一个参与者投完票,即使得所有参与者加入组播组完成了选举过程。

(2)你的设计是如何同步选举开始的,使得每个进程都准备就绪,等待接收组成员发出的任何选票?

选举开始的标志是运行时,在打开窗口时,第一次在窗口中进行成功投票。之后投票开始,每个参与者进行投票时都要打开一个窗口,而每个参与者投票成功时都会在第一次成功投票的窗口中显示投票的累积结果。直到最后一个参与者投完票,该窗口所显示的就是最终的投票结果,票数多的人即是选举成功的。

猜你喜欢

转载自blog.csdn.net/qq_61897141/article/details/128175538