データの送り方

MIDIを作れるJavaアプレットを作っているのだ。
前回では終了処理を行ったのだ。

第7回で、出来上がったデータをCGIに向けて送り出す方法を書きました。
しかし、実はあの方法で送りつけると、サーバーによっては「404 Not Acceptable」のエラーを起こすことがわかったのです。
さて、何が問題なのか考えてみましょうか。

POST (実行するCGIのパス) HTTP/1.1
Host: (ホスト名):(ポート番号)
Content-Type: multipart/form-data; boundary=(区切り文字列)
Content-Length: (受け渡すデータのサイズ)
Connection: close
(空行)
(バイナリデータ)

…はて、送りつけるのは複数のパートに分かれた(multipart)フォームデータ(form-data)でしたっけ?
こちらが勝手に決めた法則で並べられた一連のバイナリデータであり、「multipart/form-data」じゃないみたいです。
もしかすると、気の利いたサーバーだと「multipart/form-data」としておくと送られてきたデータをフォームデータとして解析してCGIに渡そうとするのかもしれません(あくまでも私の勝手な予想です)。
ともかく、一連のバイナリデータであるということで、Content-Typeを「application/octet-stream」としておきます。

POST (実行するCGIのパス) HTTP/1.1
Host: (ホスト名):(ポート番号)
Content-Type: application/octet-stream
Content-Length: (受け渡すデータのサイズ)
Connection: close
(空行)
(バイナリデータ)

コードはそう変わっていませんが次のようになります。
せっかくなので80以外のポートにも対応させました。
エラー処理はここでは省略していますが実際は書いてますよ!

Socket socket;
String host = applet.uri_save.getHost();
String path = applet.uri_save.getPath();
int port = applet.uri_save.getPort();
if (port==-1) port=80;
socket = new Socket(host,port);
PrintWriter print = new PrintWriter(socket.getOutputStream());
print.println("POST "+path+" HTTP/1.1");
print.println("Host: "+host+":"+Integer.toString(port));
print.println("Content-Type: application/octet-stream");
print.println("Content-Length: "+stream.size());
print.println("Connection: close");
print.println();
print.flush();
stream.writeTo(socket.getOutputStream());
socket.getOutputStream().flush();

要点

今回のソース

もちっと続けたいなぁ