• 締切済み

java初心者です。

ソケットクラスを用いて入力ファイルの内容をWebサーバへ送信し、サーバからの応答を別ファイルに出力するクライアントプログラムを作りたいのですが、わからないです。 ソケットクラスを使うので送受信はバイト型でやらないといけないと聞きました。 入力ファイルの内容(HTTPリクエスト)をバイト型に変換して、それを送信するにはどのようなプログラムになりますか? できれば詳しく教えていただきたいです。

  • Java
  • 回答数1
  • ありがとう数1

みんなの回答

  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.1

バイナリ処理の Stream は、 テキスト処理の Reader/Printer に変換すれば、 見た目はテキストでも実際はバイナリとして処理されるので便利です。 // サーバーへの要求 request = socket.getInputStream(); // テキストとして書き込めるように変換 requestText = new PrintStream(request); // 行単位で処理 requestText.println("GET /hoge/boke?huga=hanya HTTP/1.0"); requestText.println("Host: foobar.example.com"); requestText.println("User-Agent: oreore/0.1 java/1.8"); requestText.println(""); // ← 大切な処理! // サーバーからの応答 response = socket.getInputStream(); // テキストとして読み取れるように変換 responseText = new InputStreamReader(response); // 読みやすくなるように変換 responseReadable = new BufferedReader(responseText); // 行単位で処理 (Java8の例) responseReadable.lines().forEach(line -> 別ファイルに行出力する処理(line)); 余計なお世話かもしれませんが HTTP 通信を行うなら java.net.HttpURLConnection を使うほうが確実かと思います。 汎用ソケットでやるならば HTTP に関する深い知識が必要ですのでがんばってください。

sarmray77
質問者

補足

入力ファイルの中にリクエスト要求が書いてあって、そのファイルを読み込んでやりたいんですけど・・・。

関連するQ&A

  • JAVA初心者で申し訳ございません。

    JAVA初心者で申し訳ございません。 クライアントとサーバにそれぞれJAVAプログラムがあるとします。 (1)クライアントのJAVAプログラムである情報を取得し、 (2)その情報をサーバにあるJAVAプログラムに渡して (3)サーバのJAVAプログラムでその情報を処理したい(ログ出力など)。 (2)の方法は、どのようなものがあるのでしょうか? 初心者なので簡単な方法を教えていただけないでしょうか? (セキュリティとか気にしないでよいです。) サーバ側にHTTPサーバをたててHTTP通信する方法なんかもあるのでしょうか?

    • ベストアンサー
    • Java
  • javaプログラム初心者です。

    入力ファイルの内容をWebサーバプログラムへ送信し、サーバからの応答を別ファイルに出力するクライアントプログラムを作っているのですが、出力ファイルにはなにも書き込みがされていません。(サーバからの応答は事前に不明でその長さが可変長である) 以下が作ったプログラムです。間違っているところを詳しくご指摘いただけるとありがたいです。お願いします。 import java.net.*; import java.io.*; public class client{ static final int BUFSIZE = 1792; public static void main(String[] args){ try{ String server = args[0]; //接続先のIPアドレス File file1 = new File(args[1]); //入力ファイル(HTTPリクエスト) FileReader filereader = new FileReader(file1); BufferedReader br = new BufferedReader(filereader); int serverport = Integer.parseInt(args[2]); //ポート番号 File file2 = new File(args[3]); //サーバからの応答をファイルに書き込む用 FileWriter filewriter = new FileWriter(file2); BufferedWriter bw = new BufferedWriter(filewriter); byte[] bytebuffer = new byte[BUFSIZE]; String str; while((str = br.readLine()) != null){ //入力ファイルの内容を1行ずつ読み込む bytebuffer = str.getBytes(); //入力ファイルの文字列をバイトに変換 } Socket socket = new Socket(server,serverport); //ソケットの生成 System.out.println("Connected to server...sending echo string"); InputStream in = socket.getInputStream(); //入出力ストリームの取得 OutputStream out = socket.getOutputStream(); out.write(bytebuffer); //文字列を送信 int receive; while((receive = in.read(bytebuffer))!=-1){ bw.write(new String(bytebuffer)); //サーバからの応答をファイルに出力 } bw.close(); socket.close(); }catch(IOException e){ } } }

  • HTTPリクエスト

    JSPのクライアントからサーブレットにHTTPリクエストを送信する部分について、質問させていただきたく思います。 [実現したいこと] ・クライアント側からのHTTPリクエストのヘッダの内容を、任意のものに書き換えてサーブレットに送信。 [環境] WEB APサーバー:Web Sphere Aprication Server HTTPヘッダを読み取って、ヘッダ内のクライアント情報を元にクライアント別の処理を振り分ける機能を作ったのですが、そこの機能をテストするのに上の機能を使いたいと思ってます。。。 皆様のお知恵を拝借できればと思います。 よろしくお願いいたします。

  • C言語でHTTP1.1のキープアライブを使用したい

    ご存知であればお知恵を貸してください。 C言語のソケットプログラムで、HTTP1.1のキープアライブを有効にする方法を調べています。 経緯としては、Unix(SystemV系)のC言語でHTTPクライアントを作成しました。 GET(またはPOST)メソッドのHTTPリクエストを発行して、そのレスポンスをコンソールに表示するような一般的なソケットプログラムです。 (socket() → connect() → send() → recv()と言った流れです) 連続してリクエストする場合があるので、connect()で作成したコネクションをプログラム中で使用し続けたいのですが、一度のリクエスト、レスポンスでコネクションが切断されてしまいます。(HTTPの仕様) HTTP1.1で定義されているキープアライブを使用すればよいと考え、ソースコードにおいて以下の対応を追加しました。 ・setsockopt()でSO_KEEPALIVEを有効にする。(socket()とconnect()の間で呼び出し) ・送信するHTTPヘッダのプロトコルバージョンを1.1として、Host:ホスト名、Connection: Keep-Aliveを設定 HTTP1.1でキープアライブを有効にしている自宅のApache2.2がターゲットなのですが、上記対応後もコネクションが切断されてしまいます。 Apacheについては、環境変数の出力結果からHTTP1.1でキープアライブが有効になっていることは確認済みです。 HTTPクライアントプログラムについては、都度コネクションを張れば問題なく動作するので基本部分は間違っていないと考えています。 HTTPクライアントプログラムで、キープアライブを有効にするための何かが欠けているのだと推測しているのですが、どなたか何かお気づきのことはございませんでしょうか? #手元にソースコードがないために、掲載できないので漠然とした質問になってしまいました。すみません。

  • (初心者です)HTTP POST について

    HTTP POST について教えてください。 ログの解析をする際に、POSTで転送されたデータ(送られた内容)を調べたいのですが、 クライアントからサーバに対してリクエストしたPOSTデータ(エンティ ティボディの内容)をサーバ側で確認するにはどの箇所を確認すれば良いのでしょうか。

  • ブラウザのHTTPリクエストを参照したい

    画面遷移時にブラウザ側でHTTPリクエストがどのように発行されているかを参照する手段を探しています。 Webサーバー側でHTTPリクエストの内容をログに出力する方法はわかっているのですがサーバー操作は不可なのでクライアント側で参照する方法を探しています。 ツール、設定なんでもいいのでアイデアがあれば教えていただけないでしょうか。 よろしくお願い致します。

  • ソケット通信の送受信遅延

    MFCのCAsyncSockを使ってクライアントとサーバでメッセージの送受信をしています サーバからsend()でメッセージを送信し クライアントはOnReceive()の中でreceive()し メッセージを受信後、応答をsend()で返信します これを10msec間隔で行っているのですが ランダムに送信か受信で300msec前後の遅延が発生します なぜでしょうか? ちなみにソケットオプションで「TCP_NODELAY」を設定しています かなり困っています 気になることでも何でもいいので是非アドバイスをお願いします

  • ネットワーク初心者です。

    ネットワーク初心者です。 borland C++でプログラム作成しているのですが、windowsクライアントからサーバーに対してソケットを生成して(c言語)、ファイルをhttp通信で送信したいんですが、うまくいきません。とりあえず、ソケット生成とサーバーcgiプログラムを呼び出すことは出来たんですが、それに対してhttpでファイルを送信するには、どうすればいいのでしょうか? 誰か、ご教授願えますか? ちなみに、サーバーcgi呼び出したのは、 sprintf(send_buf, "POST %s http/1.0\r\n\r", path); send(s, send_buf, strlen(send_buf),0); sprintf(send_buf, "Host: %s:%d\r\n", host, port); send(s, send_buf, strlen(send_buf), 0); sprintf(send_buf, "\r\n"); send(s, send_buf, strlen(send_buf), 0); です。

  • apache+phpにおいてリクエストにHTTP/1.0で応答させたい

    apache+phpにおいてリクエストにHTTP/1.0で応答させたい apache1.3.29+php4.3.11環境において クライアントからのリクエストに対して、常にHTTP/1.0 で応答させたく httpd.confファイル中で LoadModule php4_module "D:\php\sapi\php4apache.dll" の前行に SetEnv downgrade-1.0 force-response-1.0 を追記しました。 しかし、 テスト用htmlファイルを作成し クライアントPCからhtmlファイルにアクセスした時はHTTP/1.0を応答するのですが テスト用phpファイルを作成し クライアントPCからphpファイルにアクセスした時はHTTP/1.1を応答してしまいます。 (確認はネットワーク解析ツールにて行っています。) ネットで調べるとphp.iniのcgi.rfc2616_headersが関係しそうだったのですが デフォルト(0)であればapacheの設定が有効らしく、そののままにしてあります。 php.iniやhttpd.conf、もしくは他のファイル等で何か設定しなければいけないのでしょうか? ご存知の方がいらっしゃいましたらお手数ですがお教えください。

  • PHPUnitを使った逐一実行プログラムのテスト方

    今とあるバッチのテストをしようと考えています。 バッチの処理としては、DBから必要なデータを取ってきて(クラスを使っています)、そのデータを元にPEAR::HTTP_Requestクラス使ってGETリクエストを送信するようなものです。 そもそもテストというものに関してド素人なのでよくわかっていないのですが、こういったプログラムをPHPUnitを使ってテストすることは可能なのでしょうか。 出来ればDBからデータ取ってくる部分と、HTTP_Requestクラス使ってGETリクエストを投げる部分をモック化(?)して、これらの戻り値をこっちで制御していくつかのケースでテストしたいです。 テストの先頭で、requireで読み込んだらファイルが実行されてしまうし、execなどを使ってもプログラム内のクラスをモック化する方法が分かりません。 長くなりましたが、聞きたい事としては、こういった逐一実行するようなプログラムのテストはPHPUnitを使ってテスト出来るものなのでしょうか。 また、PHPUnitを使ってテストする場合、テスト対象ファイルの内部で読み込まれたクラスをモック化するにはどうしたらよりのでしょうか。

    • ベストアンサー
    • PHP

専門家に質問してみよう