0

サーバー/クライアントクラスを実装する宿題があります。これにより、1400バイトのパケットをサーバーに送信し、それらを応答として返します。スループットをkbit/sで混乱させる必要があり、サーバーによるタイムアウトが発生したときに出力する必要があります。しかし、問題は、Client-Classでスループットを計算し、Server-Classのtimeout-exceptionの「catchblock」に出力しようとしていることですが、この値は常に0.0として送信/出力されます。これは、クライアントクラスで印刷する場合には当てはまりません。静的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);
}
}
4

2 に答える 2

1

サーバーとクライアントの両方が同じプロジェクトにあることは問題ではありません。2 つのインスタンスを実行しているため (Eclipse の再生ボタンを 2 回使用)、それらは何も共有していません。

サーバーとクライアントが同じプログラムの異なるスレッドの場合、それらは属性を共有できますが、宿題(または私が考えることができるアプリケーション)にとっては意味がありません。

以前のコメントで述べたように、クライアントとサーバーの両方でスループットを計算する必要があります。

共通のロジックを保持する 3 番目のクラス、スループット計算機を作成できます。その後、クライアントとサーバーの両方がコードを再利用できます。実行時に同じコードの異なるコピーを実行するため、値を共有しないことに注意してください。

于 2012-12-01T18:51:28.853 に答える
0

明らかなエラーの 1 つは、静的イニシャライザを使用しUDPClient.getDurchsatz()てサーバー クラスから呼び出していることです。2 つのクラスが同じパッケージにあるため、これは機能しますが、サーバー クラスの非静的初期化子コードが実行される前にその呼び出しが行われるため、機能しません。したがって、デフォルト値を読み取っています。これは adoubleです0。クライアント クラスに静的イニシャライザを追加して値をゼロ以外に設定する場合は、代わりにその値を取得する必要があります。

このようなものが機能する前に、フィールドから静的初期化を削除し、代わりに必要なときにクライアント クラスに値を要求する必要があります。

ただし、コードを詳しく調べなくても、アーキテクチャの変更も必要になると思います。スループットを計算する通常の方法は、(一連の) 送信または受信呼び出しが行われる場所で時間を測定し、転送されたデータの量と経過時間に基づいてスループットを計算することです。これは、クライアント側でもサーバー側でも実行でき、そのために 2 つの間に別の通信チャネルを用意する必要はありません。

于 2012-12-01T19:02:57.147 に答える