K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[2009] Re:Javaの実装の隠ぺいに関して
返信


投稿者:beginner
2017/10/05 11:36:34

Link:
ご回答ありがとうございます。
非常に参考になりました。
DIについては軽い知識のみで深く考えたことなかったため、改めて勉強し直すきっかけになりそうです。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2008] Re:Javaの実装の隠ぺいに関して
返信


投稿者:(ぱ)こと管理人
2017/10/05 08:33:28

Link:
はじめまして。拙著を読んでいただきありがとうございます。

>しかし、Factory.java内で"import com.sample.libimpl.*"を記載せざるを得ません。
>何を気にしているかというと、Cで言えば、パブリックなヘッダに、プライベートなヘッダを書いているようなコードに見える点です。
>利用者から完全に〜impl部分を隠ぺいする一般的な手法はあるのでしょうか。

これは確かにその通りなのですが、私はこれについては
「まあ、Factoryだけはしょうがない」
と考えています。
どこかで実装クラスが何であるかを明示しなければいけない以上、
そこでは実装側のパッケージをimportせざるを得ません。
# 「Java謎+落とし穴〜」にどう書いたかと思って見返したら、
# 「実はここが頭の痛いところなのですが〜」と書いてますね……

利用者からさらに実装を隠蔽し、状況によって実装クラスを
差し替える手法として、Dependency Injectionという考え方もあります。
ただ、実装をあまり分離しすぎると、それはそれでわかりにくくなったりもします。

https://twitter.com/kudzu/status/862906043591925762
>DI使ってコード書いてるわし「こんな簡潔にモジュラーでテスタブルなコードが書ける!すごい!天才!」
> DI使った他人のコード読んでるわし「おい、これどこから呼ばれてんだよ。わかんねぇぞ。○すぞ。」
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2007] Javaの実装の隠ぺいに関して
返信


投稿者:beginner
2017/10/04 09:56:29

Link:

はじめまして、前橋さんの各種書籍で一からからプログラミングの基礎体力づけをさせていただいています。

Javaを使った一般的なコードの書き方で疑問を抱いたことがございます。

下に適当な4つのサンプルプログラムを書きました。
mainを呼び出す利用者にimplの実装を隠ぺいすることを目的としています。
Factoryクラスを経由してインターフェースを返すようにしています。

しかし、Factory.java内で"import com.sample.libimpl.*"を記載せざるを得ません。
何を気にしているかというと、Cで言えば、パブリックなヘッダに、プライベートなヘッダを書いているようなコードに見える点です。
利用者から完全に〜impl部分を隠ぺいする一般的な手法はあるのでしょうか。

もしよろしければ教えていただけますと大変助かります。

プログラミング初心者のため勘違い含んでいたりした場合大変恐縮です。

==================================
$ vi com/sample/Main.java

package com.sample;
import com.sample.lib.*;

class Main{
  public static void main(String[] args){
    Another another = Factory.create();
    another.hello();
  }
}
==================================
$ vi com/sample/lib/Factory.java

package com.sample.lib;
import com.sample.libimpl.*;

public class Factory{
  public static Another create() {
    return new AnotherImpl();
  }
}
==================================
$ vi com/sample/lib/Another.java
package com.sample.lib;

public interface Another {
  void hello();
}
==================================
$ vi com/sample/libimpl/AnotherImpl.java
package com.sample.libimpl;
import com.sample.lib.*;

public class AnotherImpl implements Another {
  public void hello(){
    System.out.println("hello another class");
  }
}
==================================
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2006] 【業務連絡】しばらくドメインが停止していました
返信


投稿者:(ぱ)こと管理人
2017/10/02 23:38:12

Link:
9/27の夜あたりから、kmaebashi.comにアクセスできない状態になっておりました。
ご迷惑をおかけしまして申し訳ありませんでした。

<原因>
kmaebashi.comは、2004年2月頃に、TwodotsNetなる業者でレンタルサーバを
借りて、その際ドメインも取ったのですが、この業者は2005年4月に
倒産してしまいました。

http://kmaebashi.com/zakki/zakki0039.html#rentalserver

その際、ドメインの連絡先メールアドレス(Tech Email)の更新を
怠っていたため、無効なメールアドレスだとしてレジストラが停止措置を
取ったとのことです。修正して復旧していただきました。

当方のミスにてご迷惑をおかけいたしました。

今後ともよろしくお願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2005] Re:『Java謎+落とし穴徹底解明』の正誤について
返信


投稿者:(ぱ)こと管理人
2017/09/24 23:53:24

Link:
ご指摘の点、正誤表に記載しました。

>>7.3.1の直列化を使った「深いコピー」はある種裏技的なものなので、
>>ここでの「深いコピー」は、あくまで6.5のものを意味しています。
>
>お言葉を返すようで恐縮ですが、直列化を使った「深いコピー」は7.3.2で説明され、7.3.1ではその前振りとしてclone()での「深いコピー」の具体的コーディング例が載っています。そして、6.5にはclone()での「深いコピー」の具体的方法の記述は見当たらないようです――というのが私の理解なのですが…。それこそこちらの勘違いでしたら、本当にすみません。
>
おっしゃるとおりです。確かに、6.5.ではclone()の実装方法について説明はしていますが、
それは「深いコピー」ではありませんでした。
7.3自体が裏技の説明なので、そこを参照というのも妙な気がしますが、
7.3.1にしか深いコピーの具体的実装はないですね……

正誤表にはそのように記載しました。ご指摘ありがとうございました。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2004] Re:『Java謎+落とし穴徹底解明』の正誤について
返信


投稿者:藤四郎
2017/09/22 21:34:17

Link:
ご返信ありがとうございます。

>15年も前の本ですが、色々ご指摘ありがとうございます。
>次の週末に正誤表に掲載いたします。

私は誤解やら勘違いやらをしょっちゅうやらかす人間なので、ほとんどをご確認いただけて安堵しました。お忙しい中お手数おかけして恐縮ですが、いまなお精読するに値する本だと思うので、よろしくお願いします。

>7.3.1の直列化を使った「深いコピー」はある種裏技的なものなので、
>ここでの「深いコピー」は、あくまで6.5のものを意味しています。

お言葉を返すようで恐縮ですが、直列化を使った「深いコピー」は7.3.2で説明され、7.3.1ではその前振りとしてclone()での「深いコピー」の具体的コーディング例が載っています。そして、6.5にはclone()での「深いコピー」の具体的方法の記述は見当たらないようです――というのが私の理解なのですが…。それこそこちらの勘違いでしたら、本当にすみません。

こちらこそ、ありがとうございます。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2003] Re:『Java謎+落とし穴徹底解明』の正誤について
返信


投稿者:(ぱ)こと管理人
2017/09/21 00:56:22

Link:
はじめまして。反応が遅くなりまして申し訳ありません。

15年も前の本ですが、色々ご指摘ありがとうございます。
次の週末に正誤表に掲載いたします。

1点だけ。

>p.99 4行目
>その方法については「6.5 clone()とCloneable」で説明します.
>→ 「その」が「深いコピー」を指すのなら、それは7.3.1で説明されているような…。

7.3.1の直列化を使った「深いコピー」はある種裏技的なものなので、
ここでの「深いコピー」は、あくまで6.5のものを意味しています。

>p.340 33行目(下から3行目)
>FactoryTestImpl
>→ あるいは私の理解が足りないだけかもしれません。しかし、これを直前の段落にあるWindowTestImplに置換すれば理解したつもりになれるのですが…。

ここはWindowsTestImplが正しいです。これが理解の妨げになっておりましたら
申し訳ありません。

ありがとうございました。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2002] 『Java謎+落とし穴徹底解明』の正誤について
返信


投稿者:藤四郎
2017/09/16 21:07:59

Link:
はじめまして。

『Java謎+落とし穴徹底解明』は改訂も増刷もされていないのがとても残念です。現行のJavaでは本書で指摘されていた問題点の多くは改善されているらしいですが、本質的な理解を得るのに本書はまだまだ「現役」ではないかと素人ながら思います。(ただ、3.6.7や7.1は、相応の開発経験のない私には、まだしっくり理解できません。)

さて、まだそちらの正誤表に載っていない事項を見つけたと思いました。重箱の隅的なものばかりで単に煩わしいかもしれませんが、報告させていただきます。(第4刷)

p.37 3行目
fillPatternCodeで指定される色
→ fillPatternCodeで指定される中塗りパターン

p.74 8行目
ことにになり,

p.90 12行目
p2 = new Point();
→ Point2D()

p.99 4行目
その方法については「6.5 clone()とCloneable」で説明します.
→ 「その」が「深いコピー」を指すのなら、それは7.3.1で説明されているような…。

p.104 Fig.2.14
1 2 3 4
→ 0 1 2 3

p.166 下から2行目
elseif

p.203 NOTE
IntStackがIntArrayの一部であり
→ 「IntStackはIntArrayを持っている」ので「IntArrayがIntStackの一部であり」かと思います。

p.212 Fig.3.16
Polyine
p.213 List 3.24 XDrawApplet.java l.25
"Polyine"

p.214 List 3.30 ShapeIterator.java
→ 誤りではないですが、 4.2.4 (p.246) との整合性からpublicはないほうがよいのでは? Drawableなどの他のinterfaceではpublicされてないですし…。

p.217 List 3.34 DrawWindow.java l.24, 27
scale
→ 誤りではないですが、他の箇所ではthis.scaleとされています。

p.217 List 3.34 DrawWindow.java l.126, 143, 151, 158
dcToWcX(e.getX()), dcToWcX(e.getY()));
→ dcToWcX(e.getX()), dcToWcY(e.getY())); // こちらも、 xMin, yMinを 0にしているため発現しませんが。

p.225 1行目
finish()
→ finishCommand()

p.240 Fig4.3
CLASSPAHT

p.340 33行目(下から3行目)
FactoryTestImpl
→ あるいは私の理解が足りないだけかもしれません。しかし、これを直前の段落にあるWindowTestImplに置換すれば理解したつもりになれるのですが…。

p.350
} catch (Exception ex) {
    err.printStackTrace();

p.354 List 7.1 l.1
import java.security.*;
→ 不要と思われます。

p.355 1行目
SecurityManagerのgetStackTrace()メソッドは
→ SecurityManagerのgetClassContext()メソッドは

p.357 22行目
兼ね合いもなどある

p.365 1行目
Colorというフィールド
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2001] Re:P.17:終了のマークとして0を送付について
返信


投稿者:(ぱ)こと管理人
2017/08/23 19:06:08

Link:
>一方、TcpServerがserver_send.txtを送る際は、終了のマークとして0を送っていませんし、さらに‐1も送っていませんが、TcpClient側は‐1の受信で受信の終了を認識しています。

TcpClient.javaは、InputStremのread()メソッドで入力を1バイトずつ
読み込んでいますが、read()メソッドは、正常に1バイト読み込んだ時、
0〜255の値を返します。つまり、TcpClientが-1を受信するということは
あり得ません。-1が返るのは、「ストリームの終わりに達した場合」です。

https://docs.oracle.com/javase/jp/6/api/java/io/InputStream.html#read()

なぜクライアントから見てストリームが終わるのかといえば、それは
サーバ側でソケットをclose()したからです。

TcpClient.javaにて、終了のマーク0を送信しているのは、このソケットは
まだサーバからデータを返すのに使うので、このタイミングでclose()するわけには
いかないからです。

これで回答になっておりますでしょうか?
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2000] P.17:終了のマークとして0を送付について
返信


投稿者:くまきち
2017/08/21 00:29:24

Link:
お世話になっております。
疑問に思った点があり、また質問させて頂きます。

P.16のTcpClient(リスト1-2)では、client_send.txtを送る際、終了のマークとして0を送付することで、P.15のTcpServer(リスト1-1)側は、受信の終了を認識しています。

一方、TcpServerがserver_send.txtを送る際は、終了のマークとして0を送っていませんし、さらに‐1も送っていませんが、TcpClient側は‐1の受信で受信の終了を認識しています。

この違いは、どこから来るものでしょうか?
server側とClient側の仕組みの違いからくるものでしょうか?それとも、受信と送信の順番の違いからくるものでしょうか?

またまた初歩的な質問なのかも知れませんが、よろしくお願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1999] Re:TestBBS.javaについて
返信


投稿者:(ぱ)こと管理人
2017/08/17 23:11:10

Link:
>お世話になっております。
>P.108の最終行に「このメソッドはTestBBS.javaでは使用していません。」と記載がありますが、この”TestBBS.java”が、どのソースコードを意味するものなのか分からず、質問させて頂きました。

申し訳ありません。誤植(というか修正ミス)のようです。
元になったWeb記事
http://kmaebashi.com/programmer/webserver/henacat.html
では、ShowBBS.javaとPosBBS.javaをまとめてTestBBS.javaというソースに
含めていました。
ただし、Javaでは1クラス1ファイルが普通なので、書籍化する際に分離したのですが、
この部分について修正が漏れておりました。
よってこの部分は、「このメソッドはサンプル掲示板では使用していません」に
読み替えてください。
正誤表に載せておきます。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1998] TestBBS.javaについて
返信


投稿者:くまきち
2017/08/15 22:52:03

Link:
お世話になっております。
P.108の最終行に「このメソッドはTestBBS.javaでは使用していません。」と記載がありますが、この”TestBBS.java”が、どのソースコードを意味するものなのか分からず、質問させて頂きました。
よろしくお願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1997] Re:URLエンコードについて
返信


投稿者:くまきち
2017/08/05 23:06:10

Link:
回答、ありがとうございます。
下記の回答内容を見ながらP.76まで読み進めてみて理解することができました!
また、質問させていただくかも知れませんが、よろしくお願いいたします。



>>P.63からの「URLエンコードに対応する」の説明で理解できない部分があり、投稿させて頂きました。
>>P.64の上から2行目に、元の文字列の文字コードによって(例えば、Shift-Jisか、UTF-8か、EUCかによって)、エンコード結果が異なると書いてあります。
>>一方で、同じページのもう少し下の部分には「IEやFireFoxともにUTF-8でエンコードしたものを…」と記載があります。
>>これは「元の文字列の文字コードによって」という部分と矛盾するように感じ、よく分からなくなりました。
>>また、P.65の補足(下)でも、Shift-Jisとしてエンコードする例があり、ますます混乱しています。
>
>返信が遅くなりまして申し訳ありません。
>
>p.64冒頭にあるように、URLエンコードは、『元の文字列をバイト単位で解釈し、
>「%」の後ろにその16進表記をつなげたもの』です。よって、元の文字列を
>どのエンコーディング(文字コード)で解釈するかにより結果は変わります。
>JavaのURLEncoderやURLDecoderのようなクラスライブラリで、エンコードするときも
>デコードするときもエンコーディングを指定しなければいけないのは、そのためです。
>WebサイトでURLエンコード/デコードの機能を提供しているページもよくありますが、
>そういうページでも、たいては文字コードが選べるようになっていると思います。
>
>その上で、各ブラウザがどのエンコーディング(文字コード)でURLエンコードするかに
>ついては、W3Cで定められており、それがUTF-8である、ということです。
>
>これで回答になっていますでしょうか?
>
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1996] Re:URLエンコードについて
返信


投稿者:(ぱ)こと管理人
2017/08/04 20:54:02

Link:
>P.63からの「URLエンコードに対応する」の説明で理解できない部分があり、投稿させて頂きました。
>P.64の上から2行目に、元の文字列の文字コードによって(例えば、Shift-Jisか、UTF-8か、EUCかによって)、エンコード結果が異なると書いてあります。
>一方で、同じページのもう少し下の部分には「IEやFireFoxともにUTF-8でエンコードしたものを…」と記載があります。
>これは「元の文字列の文字コードによって」という部分と矛盾するように感じ、よく分からなくなりました。
>また、P.65の補足(下)でも、Shift-Jisとしてエンコードする例があり、ますます混乱しています。

返信が遅くなりまして申し訳ありません。

p.64冒頭にあるように、URLエンコードは、『元の文字列をバイト単位で解釈し、
「%」の後ろにその16進表記をつなげたもの』です。よって、元の文字列を
どのエンコーディング(文字コード)で解釈するかにより結果は変わります。
JavaのURLEncoderやURLDecoderのようなクラスライブラリで、エンコードするときも
デコードするときもエンコーディングを指定しなければいけないのは、そのためです。
WebサイトでURLエンコード/デコードの機能を提供しているページもよくありますが、
そういうページでも、たいては文字コードが選べるようになっていると思います。

その上で、各ブラウザがどのエンコーディング(文字コード)でURLエンコードするかに
ついては、W3Cで定められており、それがUTF-8である、ということです。

これで回答になっていますでしょうか?
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1995] URLエンコードについて
返信


投稿者:くまきち
2017/07/30 16:59:05

Link:
P.63からの「URLエンコードに対応する」の説明で理解できない部分があり、投稿させて頂きました。
P.64の上から2行目に、元の文字列の文字コードによって(例えば、Shift-Jisか、UTF-8か、EUCかによって)、エンコード結果が異なると書いてあります。
一方で、同じページのもう少し下の部分には「IEやFireFoxともにUTF-8でエンコードしたものを…」と記載があります。
これは「元の文字列の文字コードによって」という部分と矛盾するように感じ、よく分からなくなりました。

また、P.65の補足(下)でも、Shift-Jisとしてエンコードする例があり、ますます混乱しています。

もしかしたら初歩的な質問なのかもしれませんが、詳しい方いましたら、教えてください。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1994] Re:HenacatのC#版を作りました
返信


投稿者:nendo_code
2017/07/12 22:57:45

Link:
下記に公開しました。
https://github.com/nendo-code/Henacat_sharp
ありがとうございました。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1993] Re:HenacatのC#版を作りました
返信


投稿者:nendo_code
2017/07/12 19:34:43

Link:
>まったく問題ありません。どのようなものになっているか私も楽しみです。
>
>よろしくお願いいたします。
ありがとうございます!
公開しましたらこちらの掲示板で報告させていただきますね。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1992] Re:HenacatのC#版を作りました
返信


投稿者:(ぱ)こと管理人
2017/07/11 07:57:32

Link:
はじめまして。

>その結果HenacatのC#移植版のコードが出来たので、もしよろしければGitHubで公開させていただければと考えておりますが、いかがでしょうか。

まったく問題ありません。どのようなものになっているか私も楽しみです。

よろしくお願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1991] HenacatのC#版を作りました
返信


投稿者:nendo_code
2017/07/09 17:53:38

Link:
はじめまして。nendo_codeと申します。

「基礎からのWebアプリケーション開発入門」読ませていただきました。今までなんとなくぼんやりとしか知らなかったWebの知識を整理する事ができ、非常に勉強になりました。
私はC#プログラマなので、学習にあたり細かい動きを理解するために、C#にHenacatのコードを移植して動かしてみたりしました。
その結果HenacatのC#移植版のコードが出来たので、もしよろしければGitHubで公開させていただければと考えておりますが、いかがでしょうか。
こちらとしては、「なんとなく作っちゃったから公開しよう」くらいのノリですので、ダメであればダメでよいです。(書籍として販売されている以上、ご都合などあるかもしれませんし。)

よろしくお願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1990] テスト
返信


投稿者:みっきー
2017/06/16 14:08:39

Link:
ウェブサイトから飛んできました。
掲示板ってどうやって作るのかなあという初心者です。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1988] Re:26p~27p
返信


投稿者:kokonotu
2017/04/27 16:29:13

Link:
>追加情報ありがとうございます。
>80番に修正はしてあったわけですね。失礼しました。
>その上で、今も以下のエラーが出ている、ということでよいでしょうか。
>
>>java.net.ConnectException: Connection refused: connect
>>        at java.net.DualStackPlainSocketImpl.connect0(Native Method)
>>        at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
>>        at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
>>        at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
>>        at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
>>        at java.net.PlainSocketImpl.connect(Unknown Source)
>>        at java.net.SocksSocketImpl.connect(Unknown Source)
>>        at java.net.Socket.connect(Unknown Source)
>>        at java.net.Socket.connect(Unknown Source)
>>        at java.net.Socket.<init>(Unknown Source)
>>        at java.net.Socket.<init>(Unknown Source)
>>        at TcpClient.main(TcpClient.java:6)
>
>だとすれば、TcpClient.javaの6行目でWebサーバへの接続に失敗しているわけで、
>client_send.txtの内容については(まだ送っていないので)ひとまず無関係ですよね。
>
>また、貼っていただいたTcpClient.javaにも不審な点はありません。
>当方で、貼っていただいたTcpClient.javaとclient_send.txtにて
>実験してみましたが、正しくclient_recv.txtが生成されました。
>私の環境もWindows 10です。Apacheは2.4.23なので、ほぼ同じといってよさそうです。
>
>It works!を表示したまま、とのことなので、Apacheはちゃんと起動していて、
>ブラウザからはアクセスできている状態ですよね。
>この状態で、TcpClient.javaから接続できない原因は、正直、ちょっと
>思いつきません。
>
>念のため確認ですが、Apacheを起動した方のコマンドプロンプトには、
>何かメッセージは出ていませんか?
>私の環境では以下のメッセージが出ています。
>
>C:\Apache24\bin>httpd
>AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::4cd9:c88:9a45:70bc. Set the 'ServerName' directive globally to suppress this message
>
>これは、本来httpd.confでServerNameを指定すべきところ、やってないことに
>起因するもので、この実験では問題ありません(本の中で説明していないのは
>ちょっと手抜きかもしれませんが)。他に何か出ていたりしないでしょうか。
>
>あるいは、ファイアウォールとかアンチウィルスソフトとかで接続が
>遮断されていないでしょうか。
>
>すみません、これぐらいしか思いつきません。
>
>


ご返信ありがとうございます。
apacheには

AH00558: httpd.exe: Could not reliably determine the server's fully qualified domain name, using fe80::b097:7385:e0c9:544f. Set the 'ServerName' directive globally to suppress this message

と出ております。


セキュリティソフトはNortonを入れているのでこれが原因なのかもしれません汗
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1987] Re:26p~27p
返信


投稿者:(ぱ)こと管理人
2017/04/27 02:01:20

Link:
追加情報ありがとうございます。
80番に修正はしてあったわけですね。失礼しました。
その上で、今も以下のエラーが出ている、ということでよいでしょうか。

>java.net.ConnectException: Connection refused: connect
>        at java.net.DualStackPlainSocketImpl.connect0(Native Method)
>        at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
>        at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
>        at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
>        at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
>        at java.net.PlainSocketImpl.connect(Unknown Source)
>        at java.net.SocksSocketImpl.connect(Unknown Source)
>        at java.net.Socket.connect(Unknown Source)
>        at java.net.Socket.connect(Unknown Source)
>        at java.net.Socket.<init>(Unknown Source)
>        at java.net.Socket.<init>(Unknown Source)
>        at TcpClient.main(TcpClient.java:6)

だとすれば、TcpClient.javaの6行目でWebサーバへの接続に失敗しているわけで、
client_send.txtの内容については(まだ送っていないので)ひとまず無関係ですよね。

また、貼っていただいたTcpClient.javaにも不審な点はありません。
当方で、貼っていただいたTcpClient.javaとclient_send.txtにて
実験してみましたが、正しくclient_recv.txtが生成されました。
私の環境もWindows 10です。Apacheは2.4.23なので、ほぼ同じといってよさそうです。

It works!を表示したまま、とのことなので、Apacheはちゃんと起動していて、
ブラウザからはアクセスできている状態ですよね。
この状態で、TcpClient.javaから接続できない原因は、正直、ちょっと
思いつきません。

念のため確認ですが、Apacheを起動した方のコマンドプロンプトには、
何かメッセージは出ていませんか?
私の環境では以下のメッセージが出ています。

C:\Apache24\bin>httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::4cd9:c88:9a45:70bc. Set the 'ServerName' directive globally to suppress this message

これは、本来httpd.confでServerNameを指定すべきところ、やってないことに
起因するもので、この実験では問題ありません(本の中で説明していないのは
ちょっと手抜きかもしれませんが)。他に何か出ていたりしないでしょうか。

あるいは、ファイアウォールとかアンチウィルスソフトとかで接続が
遮断されていないでしょうか。

すみません、これぐらいしか思いつきません。

[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1986] Re:26p~27p
返信


投稿者:kokonotu
2017/04/26 15:12:51

Link:
>こんにちは。読んでいただきありがとうございます。
>
>>>【結果】 
>>java.net.ConnectException: Connection refused: connect
>
>エラーメッセージがこうなので、Webサーバへの接続に失敗しています。
>
>TcpClient.javaは、最初は自前のサーバTcpServer.javaに接続し、
>p.26でApacheに接続しようとしていますが、
>TcpServer.javaはポート番号8001で待ち受けるのに対し、
>Apacheは(設定を変えなければ)80番で待ちます。
>
>推測ですが、p.26の一番下のポート番号の変更を忘れている、
>ということはないでしょうか?
>当方でやってみたら、同じエラーが再現しました。
>
>違っていましたらすみません。


ご返信ありがとうございます。

現在TcpClient.javaに関しては

import java.io.*;
import java.net.*;

public class TcpClient {
    public static void main(String[] args) throws Exception {
        try (Socket socket = new Socket("localhost",80); //localにsocketを生成
        //下記のtxtに対して出力用のストリームを開く
             FileInputStream fis = new FileInputStream("client_send.txt");
             FileOutputStream fos = new FileOutputStream("client_recv.txt")) {

            int ch;
            // client_send.txtの内容をサーバに送信
            OutputStream output = socket.getOutputStream();
            //ストリームの終わりに達した場合は-1が返る
            while ((ch = fis.read()) != -1) {
                output.write(ch); //読み込んだ内容をOutputStreamに
            }
            // 終了を示すため、ゼロを送信
            //output.write(0);

            //ここではサーバーからの返信がいるためソケットは閉じない

            // サーバからの返信をclient_recv.txtに出力
            InputStream input = socket.getInputStream();
            while ((ch = input.read()) != -1) {
                fos.write(ch);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

と記述してあります。

client_send.txtには元々

GET /index.html HTTP/1.1
Host: localhost:8001
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: ja,en-US;q=0.8,en;q=0.6
Cookie: _ga=GA1.1.1220433733.1486961623; PHPSESSID=dl5oi2iab8460ino9qrupnqnr3

だったのを


GET /index.html HTTP/1.1
Host: localhost:80
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: ja,en-US;q=0.8,en;q=0.6
Cookie: _ga=GA1.1.1220433733.1486961623; PHPSESSID=dl5oi2iab8460ino9qrupnqnr3

にしたのですがうまくいきません

[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1985] Re:26p~27p
返信


投稿者:(ぱ)こと管理人
2017/04/22 01:41:06

Link:
こんにちは。読んでいただきありがとうございます。

>>【結果】 
>java.net.ConnectException: Connection refused: connect

エラーメッセージがこうなので、Webサーバへの接続に失敗しています。

TcpClient.javaは、最初は自前のサーバTcpServer.javaに接続し、
p.26でApacheに接続しようとしていますが、
TcpServer.javaはポート番号8001で待ち受けるのに対し、
Apacheは(設定を変えなければ)80番で待ちます。

推測ですが、p.26の一番下のポート番号の変更を忘れている、
ということはないでしょうか?
当方でやってみたら、同じエラーが再現しました。

違っていましたらすみません。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1984] 26p~27p
返信


投稿者:kokonotu
2017/04/20 16:58:55

Link:
初めてkokonotuといいます。
ポインタ完全制覇をとても楽しく読ませていただきました。
今回も勉強させて頂きます。

お聞きしたい事は、apacheを起動して[It works]が表記された事が確認後、ブラウザに表示したままTcpClient.javaを起動したのですがコマンドプロンプトにエラーが出てしまいます。何卒宜しくお願い致します。


>【結果】 
java.net.ConnectException: Connection refused: connect
        at java.net.DualStackPlainSocketImpl.connect0(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
        at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
        at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
        at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
        at java.net.PlainSocketImpl.connect(Unknown Source)
        at java.net.SocksSocketImpl.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at java.net.Socket.<init>(Unknown Source)
        at java.net.Socket.<init>(Unknown Source)
        at TcpClient.main(TcpClient.java:6)
 
【補足】 
client_sendには以下のように記載しています

GET /index.html HTTP/1.1
Host: localhost:80
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: ja,en-US;q=0.8,en;q=0.6
Cookie: _ga=GA1.1.1220433733.1486961623

【環境】 
OS: windows10

apache:2.4.25

ご教授よろしくお願いいたします
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1983] Re:書籍「Webサーバを…」の1.3.4について
返信


投稿者:(ぱ)こと管理人
2017/04/03 12:19:39

Link:
>GET /index.html HTTP/1.1
>Host: localhost:80
>Connection: keep-alive
>Cache-Control: max-age=0
>Upgrade-Insecure-Requests: 1
>User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36
>Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
>Accept-Encoding: gzip, deflate, sdch, br
>Accept-Language: ja,en-US;q=0.8,en;q=0.6

昼休みなので取り急ぎですが、このclient_send.txtの末尾の空行が抜けてませんでしょうか。
リクエストは飛んでいて、ステータスが408(タイムアウト)になっていますので。
以前も同様の質問があり、その時はレスポンスは返っていたのですが…

>3. サポートサイトよりDLした"TcpClient.java(Apache向け)"のファイル名を修正しコンパイル
>4. "java TcpClient"で実行
>
>【結果】
>25秒ほどたつと実行が終了
>client_recv.txtは生成されるが空
>
>【access_log】
>127.0.0.1 - - [01/Apr/2017:16:11:02 -0700] "-" 408 -
>
>【補足】
>ブラウザからアクセスすると問題なく接続され、access_logにも以下のログが残ります
>::1 - - [01/Apr/2017:16:15:12 -0700] "GET / HTTP/1.1" 304 -
>
>
>【環境】
>OS: macOS Sierra 10.12.4
>Server version: Apache/2.4.25 (Unix)
>javac 1.8.0_111
>
>
>何かわかることがございましたらご教授よろしくお願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1982] 書籍「Webサーバを…」の1.3.4について
返信


投稿者:けんと
2017/04/02 08:18:48

Link:
先日「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」を購入し読み進めています。
「1.3.4 TCPクライアントでWebサーバを叩く」の箇所で想定通りのHTTPレスポンスが得られなかったので質問させてください。

最後に詳細な環境をお伝えいたしますが、当方はMacで実行しています。

【手順】
1. Apacheを起動
2. 1.3.3で取得したserver_recv.txtをclient_send.txtにコピー(Hostのポートだけ80に修正してます)

GET /index.html HTTP/1.1
Host: localhost:80
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: ja,en-US;q=0.8,en;q=0.6

3. サポートサイトよりDLした"TcpClient.java(Apache向け)"のファイル名を修正しコンパイル
4. "java TcpClient"で実行

【結果】
25秒ほどたつと実行が終了
client_recv.txtは生成されるが空

【access_log】
127.0.0.1 - - [01/Apr/2017:16:11:02 -0700] "-" 408 -

【補足】
ブラウザからアクセスすると問題なく接続され、access_logにも以下のログが残ります
::1 - - [01/Apr/2017:16:15:12 -0700] "GET / HTTP/1.1" 304 -


【環境】
OS: macOS Sierra 10.12.4
Server version: Apache/2.4.25 (Unix)
javac 1.8.0_111


何かわかることがございましたらご教授よろしくお願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1980] Re:ubuntuのgccで出来てvisualstudioで出来ない
返信


投稿者:k
2017/02/07 23:57:09

Link:
1章読み終わりました。
HTTPのことが理解できてとても勉強になりました。
2章以降でも質問させてください。

[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1979] Re:ubuntuのgccで出来てvisualstudioで出来ない
返信


投稿者:(ぱ)こと管理人
2017/02/05 17:31:56

Link:
>基礎からのWEBアプリケーション開発入門
>購入し読んでおります。

ありがとうございます。

>一番初めの tcp_server.c と tcp_client.cの中に sys/socket.h
>が見つからずwin+visualstudioではコンパイルできません。

(紙の本なら)p.18の補足「C, C#の場合」に掲載している
tcp_server.cおよびtcp_client.cですね。

説明不足だったかもしれませんが、その補足の冒頭にもあるように
「もともとTCPやソケットはUNIX上で、C言語で使用されてきたもの」なので、
Linuxではそのまま使えても、Visual StudioではWindows版のソケットライブラリ
であるWinsockを使うことになります。

>sys/socket.hの中身を見てみたいのですが見当たらないのですが。。

#includeするのはsocket.hではなくwinsock2.hになりますし、
リンク時には ws2_32.libが必要です。今ぐぐったのですが、
たとえば以下のページを参考にしてください。

http://www.geekpage.jp/programming/winsock/
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[ より新しい投稿] [ より古い投稿]