質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

3022閲覧

java アクセス要求の回数を表示したい

shou_hitotose

総合スコア66

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/01/17 01:31

編集2019/01/17 02:50

指定されたファイルのアクセス要求が来た時に合計回数を示す数字を返せるようにしたいです。
具体的に言うと
$ java ex9_0 'http://localhost:12354/sort.cgi'

3 $ java ex9_0 'http://localhost:12354/sort.cgi' 4

という表示を端末に出せるようにしたいです。アクセス回数をstaticに入れればよいらしいのですがそれ以上がどうしてもわかりませんでした。少し丸投げになってしまうかもしれないのですが本気でわからないのでご教授いただけると幸いです。

Java

1import java.io.*; 2 import java.net.*; 3 4 public class rp9_2 { 5 public static void main(String args[]) { 6 try{ 7 ServerSocket ss = new ServerSocket(12354); 8 while(true) { 9 Socket s = ss.accept(); 10 InputStream instream = s.getInputStream(); 11 InputStreamReader isreader = new InputStreamReader(instream); 12 BufferedReader bfreader = new BufferedReader(isreader); 13 14 String theLine; 15 theLine = bfreader.readLine(); 16 theLine = theLine.substring(theLine.indexOf(" ")+1); 17 theLine = theLine.substring(0,theLine.indexOf(" ")); 18 theLine = theLine.substring(theLine.indexOf("/")+1); 19 System.out.print("filename: " + theLine + "\n"); 20 File theFile = new File(theLine); 21 if( theFile.exists() == false ) { 22 System.err.print("File does not exist:" + theLine + "\n"); 23 s.close(); 24 continue; 25 } 26 FileInputStream finstream = new FileInputStream(theFile); 27 InputStreamReader fisreader = new InputStreamReader(finstream); 28 BufferedReader fbfreader = new BufferedReader(fisreader); 29 30 OutputStream outstream = s.getOutputStream(); 31 OutputStreamWriter oswriter = new OutputStreamWriter(outstream); 32 BufferedWriter bfwriter = new BufferedWriter(oswriter); 33 PrintWriter pwriter = new PrintWriter(bfwriter); 34 35 pwriter.print("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"); 36 do { 37 theLine = fbfreader.readLine(); 38 if( theLine != null ) { 39 sleep(100); 40 pwriter.println(theLine); 41 pwriter.flush(); 42 } 43 } while( theLine != null ); 44 45 pwriter.flush(); 46 pwriter.close(); 47 } 48 } catch (Exception e) { 49 System.err.print(e); 50 } 51 } 52 53 static void sleep(long msec) { 54 try{ 55 Thread.sleep(msec); 56 }catch(InterruptedException ie) { 57 } 58 } 59} 

ほんとにわからないのでよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/01/17 01:33

せめてコードはマークダウンで
shou_hitotose

2019/01/17 01:34

ああ、すみませんでした。たしかマークで囲むんでしたよね
shou_hitotose

2019/01/17 01:34

ご指摘ありがとうございます。
dice142

2019/01/17 02:18

コードが正しく囲めてないですね。 おそらく最後の「```」の前に改行がないからだとは思いますが、修正お願いします。 (プレビューで表示が見れるはずなので、参考にしつつ直してみてください。)
momon-ga

2019/01/17 02:21 編集

プレビューで見ていないのもそうですが、実際に投稿した内容を自分で確認しないっていう・・・ いわゆる丸投げを感じる残念な質問ですね。
shou_hitotose

2019/01/17 02:22

プレビューで見れるんですね。ありがとうございます。ちょっとやってみます。dice142さん、momon-gaさんご迷惑をおかけしました。
shou_hitotose

2019/01/17 02:31

dice142さん まだあまりなれていないのですがすこし改行を入れてみました。まあこれでも醜いのですがなんとか答えを頂けるとありがたいです。
m.ts10806

2019/01/17 02:32

もしかして「どうなれば正解か(マークダウンのコード)」が分かってなかったりしませんか?
shou_hitotose

2019/01/17 02:33

momon-gaさん すみません。プレビューの存在を今まで恥ずかしながら知りませんでした。存在をおしえてくださってありがとうございます。いつも投稿するとなんでぐちゃぐちゃになってしまうのかよくわからなかったのですが今回momon-gaさんの私的でわかりました。ありがとうございます。
dice142

2019/01/17 02:34

いえ、できてないです。 「}」と「```」の間に改行を入れないとコードブロックとして成り立っていないです。
shou_hitotose

2019/01/17 02:35

ああすみません。マークダウン=、、、で囲むことかと思ったのですがどうやらmtsさんが思っていることと違ったのかもしれません。教えていただけるとありがたいです。不勉強なことお詫び申し上げます。
m.ts10806

2019/01/17 02:36

他の質問とか回答を見て確認されたほうがいいかもしれません。 それに全角スペースとか入れる必要はありません(構文エラーなので再現確認不可となります)。エディタからそのままコピペで貼り付ければきちんとインデントも維持されます。
dice142

2019/01/17 02:37

こちらを見ていただければと。 https://teratail.com/help/question-tips 「```」で手動で囲むより、コードをドラッグしてコードボタンを押すほうが伝わるかもしれませんね。
shou_hitotose

2019/01/17 02:38

いつも見る形になった気がします。みなさんのご指摘してくださっていることがようやくわかりました。と思います。かさねがさねすみませんでした
dice142

2019/01/17 02:38

コードブロックOKです。 あとはコードのインデントを揃えていただければ助かります。
m.ts10806

2019/01/17 02:43

最後のちょこんと置かれた全角スペース これ実際のコードにあるものではないですよね・・。 やはりdice142さんが仰るようにコード部分を選択してcodeボタンを押すのが確実かと思います。
dice142

2019/01/17 03:00

コードはかなり見やすくなりました。 mts10806様の仰る通り、全角空白があって実行できないと思いますので、 実行できるコードでその見やすさにしていただけるとパーフェクトかなと思います。
shou_hitotose

2019/01/17 03:46

分かりました。少しやってみようと思います。
guest

回答2

0

ベストアンサー

戻り値としてアクセス回数を返すのですよね?
明らかに不要なコードが含まれていることは理解していますか?

staticに入れればよいらしい

やり方以前に、元のソースの意味・挙動を理解しているのでしょうか?

現状は、ファイルの内容を出力していますが、それをHello worldに修正することは、できますか?
同様に、単純に数字の1を出力するように修正できますか?
それができれば、おのずとアクセス回数をリターンできるのでは?

まずは、不要な部分を削るとこからソースを改修してみてはどうでしょうか。


コメントから

なんとか友人たちに助けていただきできたのですが特にソースコードを削るといったことはありませんでした。削っていく方法でも本当にできるのですか?

削除するのは、ソースの意味を理解するために、削ったコードと挙動の紐づけを理解するための、
やり方であって、削ったら実現できるわけではありません。

削ることいったことはありません

んー。仕様の提示がおかしいか単純なコメントアウトをしてるから?

要件として、以下のように出力したいなら

CMD

1$ java ex9_0 'http://localhost:12354/sort.cgi' 2 33

少なくとも

java

1pwriter.print("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"); 2 3pwriter.println(theLine);

があると余計な出力があると思うのですが。

私がいった手順では、もろもろの出力処理を削除して、

java

1pwriter.print("hello world");

が、できれば以下のように出力される。

CMD

1$ java ex9_0 'http://localhost:12354/sort.cgi' 2hello world

みたいなことを実現できれば、あとは自分で考えられるのでは?
ということを意図した回答です。

投稿2019/01/17 05:20

編集2019/01/18 10:05
momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shou_hitotose

2019/01/17 05:44

回答ありがとうございます。そういった一連のことが出来ないのでこういう丸投げのような質問になってしまっています。みなさんには迷惑をかけてしまっているのは重々承知なのですがどうすればいいかはわかりません。
shou_hitotose

2019/01/17 06:21

すっごい厚かましくて恐縮なのですが書き換えたソースコード送ってもらうことは可能ですかね?teratailが他の誰かに書いてもらうというサービスでないことは知っているのですが・・・ほんとに見当さえ全くついていないので・・・。もうしわけないのですけど。一応どういうことが書いてあるのかは考えますので。
shou_hitotose

2019/01/17 06:22

もうどうしていいのかわからないのでずいぶん傲慢だなあともおもわれるかもしれないのですが・・・
momon-ga

2019/01/17 06:35 編集

傲慢じゃなくて、怠慢です。 見当が付かないなら、コンパイルエラーがでない範囲で少しづつ削っていけばいいじゃないですか。 あなたがやりたいのは、プログラムが書けるようになりたいの? それとも意味もわからず目的を達成するバイトコード(コンパイル結果)が欲しいの? ソースをもらっても意味を理解する気がないなら、バイトコードでもいいし。 ソースを理解する気があるなら、現状のソースの意味をしらべながら読めばいいんじゃない? 繰り返しになりますが、 見当が付かないなら、コンパイルエラーがでない範囲で少しづつ削っていけばいいじゃないですか。 を、やるだけでも。十分に実現できると思いますよ。
shou_hitotose

2019/01/17 06:33

なるほど。すみませんちょっと浅はかでした。
shou_hitotose

2019/01/17 06:33

おっしゃる通りですね。すみません。少し気合が足りなかった気がします。
shou_hitotose

2019/01/18 08:27

なんとか友人たちに助けていただきできたのですが特にソースコードを削るといったことはありませんでした。削っていく方法でも本当にできるのですか?
shou_hitotose

2019/01/18 08:50

あ、あの喧嘩を売っているわけではなくて単順に疑問に思っただけで
shou_hitotose

2019/01/18 10:59

なるほど。そういうことだったのですね。まあいろいろとすみませんでしたとありがとうございました。
guest

0

アクセス回数をstaticに入れればよいらしいのですがそれ以上がどうしてもわかりませんでした。

クラスはインスタンスごとに持つ変数と、クラス毎に持つ変数があり、
「static」な変数とはクラスごとに持つ変数を指します。

インスタンス変数は各オブジェクト毎に個々の値を持つので、
自身の持つインスタンス変数の値を書き換えても自身にしか影響ありません。

それに対しstatic変数はクラスで値を共有するので、
どれかのオブジェクトがstatic変数を書き換えると全員に影響します。


例えるなら、あなたはルームシェアしていてそれぞれ自分の部屋を持っています。
自分の部屋の中にはホワイトボードがあり、好きに使えます。
また、全員で共通して使えるスペース(ダイニングとか)があり、そこにもホワイトボードがあります。

あなたは自分の部屋のホワイトボードに適当に落書きしても友人Aさんには何の影響もありません。
これがインスタンス変数です。

ただし、あなたが共有スペースのホワイトボードに落書きした場合、
友人Aさんはそれを見ることができます。
そして、Aさんがそれを消すと、あなたが何もしていないのにホワイトボードは消えた状態になります。
これがstatic変数です。


で、今回はrp9_2というクラスのmainメソッド内でのみ行われているので、
(newしてrp9_2インスタンスを生成しているわけではないので)インスタンス変数は使いません。

アクセス回数を格納するstatic変数を定義して、アクセスがある度にインクリメントして表示(返送)すれば
目的のことは達成できるであろうと思います。

static変数の定義の仕方はどうやるのという場合には「java static変数」などで調べれば
サンプルコードと共に説明が載った記事が多く出てくるはずなので、そちらを見た方がわかりやすいでしょう。


なお、static変数は当然ながら実行する度に初期化になるので、
実行が終わっても値を保存しておきたいということであればデータベース等を使用することになります。

投稿2019/01/17 02:58

dice142

総合スコア5158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shou_hitotose

2019/01/17 03:36

回答ありがとうございます!
shou_hitotose

2019/01/17 03:44

少しstaticも見てみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問