- ベストアンサー
ServerSocketのaccept()の記載位置について
ServerSocketのaccept()を、main()以外のメソッド 内から呼び出したい、と思っています。 しかし、そのように記載すると、プログラムが 完全に、そこで止まってしまい、他の処理が 一切できないようになってしまいます。 main()内に書くと、ボタンなどのイベントを 拾えるのに、main()以外に書くと、処理が止まって しまいます。 accept()は、main()内に書くことしかできないのでしょうか。(できたら、ボタンを押して、サーバーの起動、 停止ができるようにしたいのですが)。 お願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 >しかし、何故、main()では、accept()を実行しても 処理が止まらないのか、気になります。 たぶんソースの順序的なもので偶然止まらなかったのだと思います。 たぶんmain内のソースがこのような順序になっているのではないでしょうか? button.addActionListener(listener); while(true){socket = serversocket.accept();} この場合、アクションリスナーが追加されてから(つまりbuttonがイベントを受け付けるようになる)ソケットがコネクションを受け付けるようになるためbuttonのアクションが有効になっています。 逆に以下のように書いた場合はボタンのアクションも有効になりません。 while(true){socket = serversocket.accept();} button.addActionListener(listener);
その他の回答 (2)
- TAKATON
- ベストアンサー率62% (17/27)
>しかし、何故、main()では、accept()を実行しても >処理が止まらないのか、気になります。 accept()呼び出しをボタンのアクションリスナクラスの actionPerformedメソッド内もしくは、 actionPerformedメソッドから呼び出した他のクラス内の メソッドに実装しませんでした? だとすれば、accept()呼び出しにより、イベントディスパッチスレッドが 停止してしまいますので、accept()メソッドが復帰し、 更には、actionPerformedメソッドが復帰するまで、イベントを 拾うことはできなくなります。従って、ボタンを押しても、 キーを押しても画面が無反応になってしまいます。 (さらには、画面の描画処理も止まってしまいますので、 画面が白くなってしまうこともあります。)
お礼
回答ありがとうございます。 イベントディスパッチスレッドとか聞きなれない 言葉が出てきましたので、いろいろ調べていたら、 シングルスレッドルールなど、難しい概念に会いました。 もう少し勉強してみます。
- Bonjin
- ベストアンサー率43% (418/971)
acceptを別スレッドで実行すればいいのでは?
お礼
回答ありがとうございます。 別スレッドにしたらうまくいきました。 しかし、何故、main()では、accept()を実行しても 処理が止まらないのか、気になります。 よろしかったらこの点についてもお願いします( 付け足しになってしまいますが)。
お礼
分かりました。 たしかにwhile(true)の前に、ボタンなどの 呼び出しがなされています。 ありがとうございました。