0

タイトルで述べたように、Java で非常に単純なファイル転送サービスを構築しようとしています。今のところ、テキスト文字列を送受信できる単純なクライアント/サーバーを構築することだけができました。コードは次のとおりです。

UDPClient.java:

import java.io.*;
import java.net.*;
class UDPClient {
public static void main(String args[]) throws Exception
{
    BufferedReader inFromUser =
        new BufferedReader(new InputStreamReader
            (System.in));
    DatagramSocket clientSocket = new DatagramSocket();//port # is assigned by OS to the client
    InetAddress IPAddress = 
        InetAddress.getByName("localhost");
    byte[] receiveData = new byte[1024];
    String sentence = inFromUser.readLine();
    byte[] sendData = sentence.getBytes();
    DatagramPacket sendPacket =
        new DatagramPacket(sendData, sendData.length, 
                           IPAddress, 7777); //data with server's IP and server's port #
    clientSocket.send(sendPacket);
    DatagramPacket receivePacket =
        new DatagramPacket(receiveData,
                           receiveData.length);
    clientSocket.setSoTimeout(1000);
    clientSocket.receive(receivePacket);
    // we still need to catch the exception and retry
    String modifiedSentence =
        new String(receivePacket.getData(),
                   0,
                   receivePacket.getLength());
    System.out.println("FROM SERVER:" +
                       modifiedSentence);
    clientSocket.close();
    }
}

UDPServer.java

import java.io.*;
import java.net.*;
class UDPServer {
public static void main(String args[]) throws Exception
{
    DatagramSocket serverSocket = new
        DatagramSocket(7777); //server will run on port #9876
    byte[] receiveData = new byte[1024];
    while(true)
        {
            DatagramPacket receivePacket =
                new DatagramPacket(receiveData, 
                                   receiveData.length);
            serverSocket.receive(receivePacket);
            String sentence = new String(
                                         receivePacket.getData(),
                                         0,
                                         receivePacket.getLength());
            InetAddress IPAddress =
                receivePacket.getAddress(); //get client's IP
            int port = receivePacket.getPort(); //get client's port #
  System.out.println("client's port # =" + port);
   System.out.println("client'sIP =" +IPAddress);
   System.out.println("client's message =" +sentence);

            String capitalizedSentence = 
                sentence.toUpperCase();
            byte[] sendData = capitalizedSentence.
                getBytes();
            DatagramPacket sendPacket =
                new DatagramPacket(sendData,
                                   sendData.length, 
                                   IPAddress, port);
            serverSocket.send(sendPacket);
        }
    }
}

最終的に私がやりたいことは、サーバーにファイル パスを送信し、サーバーにファイルを返してもらい、それを C:\Desktop\Folder などの所定の場所に保存することです。

私は今いる場所を超えて前進する方法について本当に途方に暮れているので、あなたが共有できるアドバイス、指針、またはリソースは素晴らしいでしょう. 私はこれに非常に慣れておらず、自分の深さから抜け出していると感じています。

ありがとう!

4

1 に答える 1

2

TCPとは異なり、UDPは非永続的な接続を使用します。したがって、要求パケットと応答パケットの状態を維持する必要があります。

たとえば、要求パケットは次のようになります。

  • 2バイト-ファイル名の長さ
  • (変数)-ファイル名4バイト-開始位置
  • 4バイト-シーケンス 番号。
  • 4バイト-最大チャンクサイズ

サーバーは「開始位置」から最大「最大チャンクサイズ」バイトを読み取り、次の形式でクライアントに戻ります。シーケンス 番号。クライアントがリクエストをレスポンスに関連付けることができるように、リクエストからエコーバックされます。

  • 1バイト-応答コード
  • 4バイト-シーケンス 番号。
  • 4バイト-ペイロードの長さ
  • (可変)-ペイロード
于 2013-03-07T01:12:45.927 に答える