我正在尝试使用 java 开发一个多播应用程序。这是我的代码:
这是 Lamport.Java 文件:
package dsass2;
import java.net.*;
import java.io.*;
public class Lamport
{
static int Current_Time;
static int Time_Interval;
static String Multicast_Group;
static int port;
static MulticastSocket s;
static public int SendMsg(byte[] sending)
{
DatagramPacket pack;
try{
pack = new DatagramPacket(sending, sending.length,InetAddress.getByName(Multicast_Group), port);
}
catch(UnknownHostException uhe){
System.out.println("UnknownHostException Occured in SendMsg! "+uhe);
return 0;
}
try{
s.send(pack);
}
catch(IOException io){
System.out.println("IOException Occured in SendMsg! "+io);
}
catch(NullPointerException npe){
System.out.println("You Must Initialize Lamport Logical Clock First! ");
return 0;
}
return 1;
}
static public int RecvMsg(byte[] recived)
{
DatagramPacket pack = new DatagramPacket(recived, recived.length);
try{
s.receive(pack);
}
catch(IOException io){
System.out.println("IOException Ocurred in RecvMsg! " + io);
return 0;
}
catch(NullPointerException npe){
System.out.println("You Must Initialize Lamport Logical Clock First! ");
return 0;
}
return 1;
}
static public int Initialize(String mcastip, int port, int timeinterval)
{
try{
s=new MulticastSocket(port);
}
catch(IOException io)
{
System.out.println("IOException Ocurred in Initialize! " + io);
}
try{
s.joinGroup(InetAddress.getByName(mcastip));
}
catch(UnknownHostException uhe){
System.out.println("UnknownHostException Ocurred in Initialize! " + uhe);
}
catch(IOException io){
System.out.println("IOException Ocurred in Initialize! " + io);
}
Multicast_Group=mcastip;
Time_Interval=timeinterval;
Thread Logical_Clock = new Thread(Clock_Incrementer);
Logical_Clock.start();
return 1;//it means no error occured.
}
static public int GetCurrentClock()
{
return Current_Time;
}
Lamport () //Cunstructor
{
Current_Time=0;
}
static Runnable Clock_Incrementer=new Runnable()
{
public void run()
{
while(true){
Current_Time+=Time_Interval;
try{
Thread.sleep(1000);
}
catch(InterruptedException ie){
System.out.println("Logical Clock thread interrupted! " + ie);
}
}
}
};
}
这是我的 main.java 文件:
package dsass2;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner user_input=new Scanner(System.in);
int voroodi=0;
byte[] message=new byte[1024];
while(voroodi!=5){
System.out.println("What do you want to do?\n1. Initialize Lamport Logical Clock\n2. Send a message\n3. Recieve a message\n4. Get Current Clock\n5.Exit From Program");
voroodi=Integer.parseInt(user_input.next());
switch(voroodi){
case 1:
System.out.println("Please Enter Multicast Group IP:");
String group=user_input.next();
System.out.println("Please Enter Port Number:");
int port=Integer.parseInt(user_input.next());
System.out.println("Please Enter Time interval:");
Lamport.Initialize(group, port, Integer.parseInt(user_input.next()));
break;
case 2:
System.out.println("Please Enter Your Message:");
String Msg=user_input.next();
Lamport.SendMsg(Msg.getBytes());
break;
case 3:
System.out.println("Please Wait for a Message...");
if(Lamport.RecvMsg(message)==1)
{
System.out.println("New Message Recieved:");
System.out.println(message.toString());
}
break;
case 4:
System.out.printf("Current Time is: %d\n", Lamport.GetCurrentClock());
break;
case 5:
System.exit(0);
break;
default:
System.exit(0);
break;
}
}
System.exit(0);
}
}
初始化后,当我尝试从一台计算机(ip:192.168.1.2)向局域网中的另一台计算机(IP:192.168.1.3)发送数据包时,消息发送成功,但“s.receive(pack);” RecvMsg 函数中的命令不返回,并永远阻止程序。我在 IP 为 192.168.1.3 的计算机上使用了 wireshark,我可以看到数据包传输到目标计算机!,所以可能没有防火墙,或者......问题。谁能帮忙?