0

私は初めての Java ネットワーキング プログラムを書き始めていますが、簡単に言えば、正しいアプローチをとっていることを確認するのに苦労しています。私たちの教授は、この UDP クライアントに対してテストするためのサーバー プログラムを私たちに提供してくれましたが、いくつかのエラーが発生していて、押しつぶすことができないようです。具体的には、「接続が拒否されました」または「ホストへのルートがありません」という例外のいずれかの IO 例外が発生します。

public class Lab2Client {
/**
 * @param args[1] == server name, args[2] == server port, args[3] == myport
 */
public static void main(String[] args) {
    //Serverport is set to 10085, our client is 10086
    try {
        Socket echoSocket = new Socket(args[0],Integer.parseInt(args[2]));
        System.out.println("Server connection Completed\n");
        DataOutputStream output = new DataOutputStream(echoSocket.getOutputStream());
        byte[] toSend = new byte[5];
        toSend[0] = 12; toSend[1] = 34;//Code Number
        toSend[2] = 15;//GroupId
        toSend[3] = 86;toSend[4] = 100;//Port number in Little Endian Order
        output.write(toSend);

        System.out.println("Sent Request. Waiting for reply...\n");

        DataInputStream input = new DataInputStream(echoSocket.getInputStream());

        byte[] toRecieve = new byte[]{0,0,0,0,0,0,0,0}; 
        input.read(toRecieve);
        checkMessage(toRecieve);            
    }
    catch (UnknownHostException e) {
        System.err.println("Servername Incorrect!");
        System.exit(1);
    }
    catch (IOException e){
        System.err.println("IO Exception. Exiting...");
        System.err.println(e);
        System.exit(1);
    }
}

また、Java でのメッセージの受信に関する実装についていくつか質問があります。次のいずれかを含むデータグラムを取得します。

a) IPおよびポート番号とともに3つのフォーマットバイト(質問には重要ではありません)

また

b) 3 つのフォーマット バイトと 1 つのポート。

これを行うには DataInputStream を使用するのが正しい方法ですか? 5 または 9 のいずれかの要素を動的に割り当てる代わりに、9 つの要素を持つ配列を使用するのが面倒であることはわかっていますが、今はこれを機能させようとしています。そうは言っても、これに対して誰かが提案する別のアプローチはありますか?

4

2 に答える 2

2

Socket.getOuputStream()withによって返されたストリームをラップする必要はありませんDataOutputStreamDataOutputStream

この行で:

Socket echoSocket = new Socket(args[0],Integer.parseInt(args[2]));

args[0] ではなく、args[1] であるべきだと思います。

ここでは、整数値をそのバイト表現に変換する必要があります。

   toSend[3] = 10086 & 0xFF;toSend[4] = 10086>>8; //Port number in Little Endian Order

あなたの質問への回答: ケースbを送信していないためIP

于 2012-10-01T01:06:32.987 に答える
0

これは後世に残しておこうと思いました。問題は単純で、すぐに気付かなかった私はばかです。

私がこれをテストしていた正しいプログラムは、UDP プロトコルを使用しており、このプログラムは TCP で書かれています。修正されたコードは次のとおりです。

public class Lab2Client {
/**
 * @param args[0] == server name, args[1] == server port, args[2] == myport
 */
public static void main(String[] args) {
    //Serverport is 10085, our client is 10086
    try {
        DatagramSocket clientSocket = new DatagramSocket();
        InetAddress IPAddress = InetAddress.getByName(args[0]);
        int portToSend = Integer.parseInt(args[2]);
        System.out.println("Clent Socket Created");
        byte[] toSend = new byte[5];
        toSend[0] = 0x12; toSend[1] = 0x34;//Code Number
        toSend[2] = 15;//GroupId, f in hex
        toSend[3] = 0x27;toSend[4] = 0x66;
        System.out.println("Byte Array Constructed");

        DatagramPacket sendPacket = new DatagramPacket(toSend, toSend.length, IPAddress, Integer.parseInt(args[1]));
        clientSocket.send(sendPacket);          
        System.out.println("Sent Request. Waiting for reply...\n");

        DataInputStream input = new DataInputStream(echoSocket.getInputStream());
        toRecieve can either be an error message, a return of what we sent,
        or a byte stream full of IP info and port numbers.
        the "heavy" byte stream is either 4 for IPv4 of 16 for IPv6, 2 bytes for port,
        and the magic number (2 bytes) for a total of 9-20 bytes*/

        byte[] toRecieve = new byte[9];
        DatagramPacket receivePacket = new DatagramPacket(toRecieve, toRecieve.length);
        clientSocket.receive(receivePacket);            
        checkMessage(toRecieve);            
    } //and so on and so forth...

助けてくれた@Sergeに感謝しますが、私が尋ねた方法で誰も私の質問に正しく答えることができませんでした。あなたが提案したバイトシフトも重要でした。

于 2012-10-08T22:25:56.977 に答える