我如何在java中发送1kb消息,我试图将消息从一台机器发送到另一台机器,固定大小为1kb,如何实现?
目前我可以在机器之间发送诸如“测试”之类的消息,但理想情况下我希望能够发送1kb的固定大小消息
这就是我目前正在发送测试的方式
if (myrank == 0) {
char[] mess = " test ".toCharArray();
MPI.COMM_WORLD.Send(mess, 0, mess.length, MPI.CHAR, 1, 99);
}
目前这就是我在机器之间发送消息的方式:
import mpi.* ;
class Hello {
static public void main(String[] args) {
MPI.Init(args);
int myrank = MPI.COMM_WORLD.Rank();
long startTime = System.currentTimeMillis();
if (myrank == 0) {
char[] mess = " test ".toCharArray();
MPI.COMM_WORLD.Send(mess, 0, mess.length, MPI.CHAR, 1, 99);
} else {
char[] mess = new char[20];
MPI.COMM_WORLD.Recv(mess, 0, 20, MPI.CHAR, 0, 99);
System.out.println("received:" + new String(mess));
}
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
System.out.println(duration);
MPI.Finalize();
}
}
字节数组是一个很好的解决方案吗?
需要固定大小的消息,以帮助基准测试结果,例如我希望比较发送1kb消息所需的时间增加,1mb,20mb ........ 1gb等
编辑:
这会有用吗?这会发送8位吗?int i = 10;
String text = String.format("%08d", i);
// text now contains "00000010"
// 8 bits
答案 0 :(得分:1)
如果要发送1kb消息,请创建大小为1kb的消息并发送。
import mpi.* ;
class Hello {
static public void main(String[] args) {
MPI.Init(args);
int myrank = MPI.COMM_WORLD.Rank();
int tag = 99;
long startTime = System.currentTimeMillis();
if (myrank == 0) {
char[] mess = new char [1024];
MPI.COMM_WORLD.Send(mess, 0, mess.length, MPI.CHAR, 1, tag);
} else if (myrank == 1) {
char[] mess = new char[1024];
MPI.COMM_WORLD.Recv(mess, 0, 1024, MPI.CHAR, 0, tag);
System.out.println("received:" + new String(mess));
}
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
System.out.println(duration);
MPI.Finalize();
}
}
更好的是,测量乒乓延迟,这是更好的定义(往返返回时间),并使用几个长度:
import mpi.* ;
class Hello {
static public void main(String[] args) {
MPI.Init(args);
int myrank = MPI.COMM_WORLD.Rank();
int tag = 99;
int maxlen = 512*1024*1024;
int minlen = 64;
char [] sendbuff = new char [maxlen];
char [] recvbuff = new char [maxlen];
if (myrank == 0) {
for (int len = minlen; len < maxlen; len *= 4) {
long startTime = System.currentTimeMillis();
MPI.COMM_WORLD.Send(sendbuff, 0, len, MPI.CHAR, 1, tag);
MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 1, tag);
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
System.out.println("Ping-pong time for " + len + " is " + duration);
}
} else if (myrank == 1) {
for (int len = minlen; len < maxlen; len *= 4) {
MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 0, tag);
MPI.COMM_WORLD.Send(recvbuff, 0, len, MPI.CHAR, 0, tag);
}
}
MPI.Finalize();
}
}
答案 1 :(得分:0)
在发送(发起)侧使用Socket,在接收(侦听消息)侧使用ServerSocket。 Socket允许打开输出流,ServerSocket可以生成另一个Socket,您可以在其中打开输入流。如果消息是固定大小,则没有太大区别。
你也可以使用SOAP,RMI,Protocol Buffers,CORBA,MPI等谷歌。这些将增加更多的复杂性,但也增加了功能性,并且每个应用领域都很强大。