1

Java でクライアント サーバー アプリケーションを作成しようとしています。このアプリケーションは、クライアントからサーバーに画像を転送します。要件は、アプリケーションがネットワーク バイト オーダーである必要があることです。(下の画像)

これは、将来他のプロトコルを展開する方法を学ぶのに役立つので、これを実装する方法に関するヒントを探しています。現在、サーバークライアントが動作して画像を転送していますが、プロトコルを実装する方法がわかりません。

ありがとう

これは私の現在のサーバー/クライアントコードです:

パブリック クラス NetworkServer {

public static void main(String[] args) { NetworkServer servidor = new NetworkServer(); System.out.println("Server started()"); BufferedInputStream bis; BufferedOutputStream bos; int num; File file = new File("/images"); if (!(file.exists())){ file.mkdir(); } try { ServerSocket socket = new ServerSocket(15000); Socket incoming = socket.accept(); try { try{ if (!(file.exists())){ file.mkdir(); } InputStream inStream = incoming.getInputStream(); OutputStream outStream = incoming.getOutputStream(); BufferedReader inm = new BufferedReader(new InputStreamReader(inStream)); PrintWriter out = new PrintWriter(outStream, true /* autoFlush */); String filelength = inm.readLine(); String filename = inm.readLine(); System.out.println("Server() Filename = " + filename); System.out.println("Server() File lenght: " + filelength + " bytes"); System.out.println("Server() ACK: Filename received = " + filename); //RECIEVE and WRITE FILE byte[] receivedData = new byte[1000000]; bis = new BufferedInputStream (incoming.getInputStream()); bos = new BufferedOutputStream (new FileOutputStream("/images" + "/" + "image.jpg")); while ( (num = bis.read(receivedData)) > 0){ bos.write(receivedData,0,num); } bos.close(); bis.close(); File receivedFile = new File(filename); long receivedLen = receivedFile.length(); System.out.println("Server() ACK: Length of received file = " + receivedLen); } finally { incoming.close(); } } catch (IOException e){ e.printStackTrace(); } } catch (IOException e1){ e1.printStackTrace(); } } }

プロトコル

4

1 に答える 1

3

「ネットワーク バイト オーダー」の別名は「ビッグ エンディアン」です (ウィキペディアを参照)。

ここで、int のビッグ エンディアン エンコーディングをサポートする Java のクラスを見つける必要があります。ドキュメントでは「ネットワーク バイト オーダー」や「ビッグ エンディアン」などの標準的な用語が使用されていないため、これは本来あるべきほど単純ではありません。ここでの教訓: ドキュメントは、標準的な検索用語を使用して必要なものを見つけることができれば、はるかに便利です。

つまり、探しているクラスはDataInputStreamです。

4 つの入力バイトを読み取り、int 値を返します。読み取った最初のバイトから 4 番目のバイトまでを ad とします。返される値は次のとおりです。

    (((a & 0xff) << 24) | ((b & 0xff) << 16) |
     ((c & 0xff) << 8) | (d & 0xff))

( readInt()のドキュメント)。

于 2012-08-29T08:23:11.257 に答える