我有一个功课,我们应该在其中实现服务器/客户端类,以便我们将1400Bytes数据包发送到服务器,然后我们将它们作为回复返回。我们必须以kbit / s的速度消耗吞吐量,并且必须在服务器超时时打印!但问题是我正在计算Client-Class中的吞吐量,并试图在Server-Class中的timeout-exception的'catch block'中打印它,但是这个值总是传输/打印为0.0,当我在Client-Class中打印时不是这种情况!我尝试使用简单的静态变量,使用静态get-method,但它不起作用! 有人可以帮我吗?我必须在00:00把它还给我!这会很棒!谢谢!
package blatt6;
import java.io.*;
import java.net.*;
public class UDPClient
{
static double startTime;
static double endTime;
static double dauer;
static double paketGroesseKBit = (1400*8) / 1024;
private static double durchsatz;
public static void main(String args[])
{
DatagramSocket sock = null;
int port = 7777;
String s = "";
for (int i=0; i<1400; i++) {
s = s + 'b';
}
//BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
try
{
sock = new DatagramSocket();
InetAddress host = InetAddress.getByName("localhost");
int j=0;
while(j<4)
{
//take input and send the packet
echo("Enter message to send : ");
//s = (String)cin.readLine();
byte[] b = s.getBytes();
DatagramPacket dp = new DatagramPacket(b , b.length , host , port);
byte[] buffer = new byte[1400];
DatagramPacket reply = new DatagramPacket(buffer, buffer.length);
sock.send(dp);
startTime = System.nanoTime();
//buffer to receive incoming data
sock.receive(reply);
endTime = System.nanoTime();
dauer = endTime - startTime;
durchsatz = paketGroesseKBit / ((dauer/2) * Math.pow(10, -9));
//System.out.println(dauer);
j++;
// byte[] data = reply.getData();
// s = new String(data, 0, reply.getLength());
//
// //echo the details of incoming data - client ip : client port - client message
// echo(reply.getAddress().getHostAddress() + " : " + reply.getPort() + " - " + s);
}
}
catch(IOException e)
{
System.err.println("IOException " + e);
}
}
//simple function to echo data to terminal
public static void echo(String msg)
{
System.out.println(msg);
}
public static double getDurchsatz() {
return durchsatz;
}
}
服务器:
package blatt6;
import java.io.*;
import java.net.*;
public class UDPServer
{
static double durchy = UDPClient.getDurchsatz();
public static void main(String args[])
{
DatagramSocket sock = null;
int timeout = 5000;
try
{
//1. creating a server socket, parameter is local port number
sock = new DatagramSocket(7777);
sock.setSoTimeout(timeout);
//buffer to receive incoming data
byte[] buffer = new byte[1400];
DatagramPacket incoming = new DatagramPacket(buffer, buffer.length);
//2. Wait for an incoming data
echo("Server socket created. Waiting for incoming data...");
//communication loop
while(true)
{
sock.receive(incoming);
sock.send(incoming);
// byte[] data = incoming.getData();
// String s = new String(data, 0, incoming.getLength());
//
// //echo the details of incoming data - client ip : client port - client message
// echo(incoming.getAddress().getHostAddress() + " : " + incoming.getPort() + " - " + s);
// s = "OK : " + s;
//
// DatagramPacket dp = new DatagramPacket(s.getBytes() , s.getBytes().length , incoming.getAddress() , incoming.getPort());
// sock.send(dp);
}
}
catch(IOException e)
{
System.out.println(durchy);
System.err.println("IOException " + e);
}
}
//simple function to echo data to terminal
public static void echo(String msg)
{
System.out.println(msg);
}
}
答案 0 :(得分:1)
服务器和客户端都在同一个项目中并不重要,因为你运行了两个实例(使用eclipse的播放按钮两次)它们不共享任何内容。
如果服务器和客户端在同一程序的不同线程中,它们可以共享属性,但它对您的作业(或我能想到的任何应用程序)没有意义。
如我之前的评论中所述,您应该计算客户端和服务器的吞吐量。
你可以制作第三类,一个吞吐量计算器,它保留了通用逻辑。然后客户端和服务器都可以重用代码。请记住,在执行时,它们将执行相同代码的不同副本,因此它们不会共享值。
答案 1 :(得分:0)
好吧,我看到一个明显的错误是你使用静态初始化程序从服务器类调用UDPClient.getDurchsatz()
。这是有效的,因为这两个类在同一个包中,但它也不起作用,因为在执行服务器类中的任何非静态初始化代码之前调用。因此,您正在读取默认值,double
为0
。如果向客户端类添加静态初始值设定项以将值设置为非零值,则应该获取该值。
在这样的事情有希望工作之前,你需要从字段中删除静态初始化,而而不是在需要时向客户端类询问值。
然而,即使没有详细查看您的代码,我认为您还需要进行一些架构更改。 计算吞吐量的常规方法是对发生或接收呼叫的(一组)发送或接收时间进行计时,然后根据传输和传输的数据量计算吞吐量时间。这可以在客户端或服务器端完成,并且您不需要在两者之间使用单独的通信通道来执行此操作。