• ベストアンサー

ServerSocketのaccept()の記載位置について

ServerSocketのaccept()を、main()以外のメソッド 内から呼び出したい、と思っています。 しかし、そのように記載すると、プログラムが 完全に、そこで止まってしまい、他の処理が 一切できないようになってしまいます。 main()内に書くと、ボタンなどのイベントを 拾えるのに、main()以外に書くと、処理が止まって しまいます。 accept()は、main()内に書くことしかできないのでしょうか。(できたら、ボタンを押して、サーバーの起動、 停止ができるようにしたいのですが)。 お願いします。

noname#10667
noname#10667
  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.3

#1です。 >しかし、何故、main()では、accept()を実行しても 処理が止まらないのか、気になります。 たぶんソースの順序的なもので偶然止まらなかったのだと思います。 たぶんmain内のソースがこのような順序になっているのではないでしょうか? button.addActionListener(listener); while(true){socket = serversocket.accept();} この場合、アクションリスナーが追加されてから(つまりbuttonがイベントを受け付けるようになる)ソケットがコネクションを受け付けるようになるためbuttonのアクションが有効になっています。 逆に以下のように書いた場合はボタンのアクションも有効になりません。 while(true){socket = serversocket.accept();} button.addActionListener(listener);

noname#10667
質問者

お礼

分かりました。 たしかにwhile(true)の前に、ボタンなどの 呼び出しがなされています。 ありがとうございました。

その他の回答 (2)

  • TAKATON
  • ベストアンサー率62% (17/27)
回答No.2

>しかし、何故、main()では、accept()を実行しても >処理が止まらないのか、気になります。 accept()呼び出しをボタンのアクションリスナクラスの actionPerformedメソッド内もしくは、 actionPerformedメソッドから呼び出した他のクラス内の メソッドに実装しませんでした? だとすれば、accept()呼び出しにより、イベントディスパッチスレッドが 停止してしまいますので、accept()メソッドが復帰し、 更には、actionPerformedメソッドが復帰するまで、イベントを 拾うことはできなくなります。従って、ボタンを押しても、 キーを押しても画面が無反応になってしまいます。 (さらには、画面の描画処理も止まってしまいますので、 画面が白くなってしまうこともあります。)

noname#10667
質問者

お礼

回答ありがとうございます。 イベントディスパッチスレッドとか聞きなれない 言葉が出てきましたので、いろいろ調べていたら、 シングルスレッドルールなど、難しい概念に会いました。 もう少し勉強してみます。

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

acceptを別スレッドで実行すればいいのでは?

noname#10667
質問者

お礼

回答ありがとうございます。 別スレッドにしたらうまくいきました。 しかし、何故、main()では、accept()を実行しても 処理が止まらないのか、気になります。 よろしかったらこの点についてもお願いします( 付け足しになってしまいますが)。

関連するQ&A

  • 相手のIPアドレスを知る手段

    C言語で、サーバーソケット(accept)でコネクションを確立した後、 接続された相手のIPアドレスを知る手段はありますでしょうか。 Javaでは、java.net.ServerSocketクラスの、getInetAddressという メソッドを利用して知ることができるのですが、C言語ではどうして いいのか分かりません。ご存知の方ご教授よろしくお願いします。

  • Thread処理について、教えてください!

    はじめまして、いきなりですが質問させて頂きます。 sleep()メソッドは、Threadクラスのクラスメソッドであるため、 Thread.sleep();と書けば、main()メソッドの処理を一時停止できると 書いていました。 sleep();と書けば、Threadのrun()メソッドが一時停止するのはわかりますが、なぜ、sleep();にThread.を付けたらmain()メソッドが停止するのかわかりません。 なぜなのか、簡単に教えてください。

    • ベストアンサー
    • Java
  • Socket プログラミングについて

    先日の質問ではありがとうございました。 今回はソースコードについてですが もしよろしければアドバイスお願いします。 Socket 制御を行うアプリを作成しています。 ・クライアントアプリ ・サーバアプリ の2つから構成していまして同PC上で動作させます。 クライアントから localhost 経由でサーバアプリに接続。 サーバアプリは ServerSocket を生成して accept しています。 サーバアプリで accept により Socket を生成すると その Socket を Thread に引き渡して適宜処理を行います。 その後、 再び別クライアントからの接続を待つために サーバアプリで accept したいのですが そのまま accept を呼び出しても そこで待機せずに新しい Socket を生成しています。 別クライアントからの接続を待機するにはどうしたらいいのでしょうか? ご教授お願いします。

    • ベストアンサー
    • Java
  • javaのプログラムでのセキュリティ

    本のサンプルプログラムで、 public static void main(略) { ServerSocket sSock = null; Socket sock = null; try { sSock = new ServerSocket(20); while(true) { sock = sSock.accepth(); InetAddress sockIP = sock.getInetAddress(); System.out.println(""+sockIP; } } } javaのサーバープログラムでセキュリティー上注意することはどんなことでしょうか?上のようなプログラムで20番ポートを開くとこのプログラムから侵入されることもありますか?

  • [VB2005]処理を完全に中止する方法を教えて頂けませんか?

    VB2005で開発しています。 あるイベントからメソッドを呼び、そのメソッドも次のメソッドを呼ぶような 処理があるとします。 この場合に、最上位のイベント以外から、 このイベントの処理をすべて終了する方法はございませんか? 最上位のイベントであれば、 Exit Subと書けば、そのイベント内の処理はすべて終了されると思いますが、 それを、下位のメソッドで行いたいのです。 このようなことはできないのでしょうか? もし方法がございましたら、教えて頂きたいです。 ぜひ、よろしくお願いいたします。

  • イベントの発生から対応する処理実行までの作り方

    以前に、ボタンクリックなどのイベントが起きたら すぐにそのボタンクリックに対応した処理をその場(イベント ハンドラ)で実行するのではなく、 "イベントが発生しました関数"のようなものに最初に イベント情報を渡してしまい、あとはその関数からイベントが 振り分けられていき、最終的にそのイベントに対応した処理が 実行される。といったプログラムを見たことがあるのですが、 このような技法は一般的に行われるものなのでしょうか? 巨大なプログラムになるとこのような技法が使われる気が しますが・・・ また、この技法には何か名前がついているのでしょうか? また、これに関して記載しているサイト・書籍などありましたら 教えてください。

  • ソケットプログラミングとスレッドについて

    TCP/IPソケットを用いた通信プログラムを作成しています。その上でacceptする処理を専用スレッドにしており、accept後の受信処理をまた別のスレッドで処理しています。コンソールプログラムにおいてサーバとクライアントを用意しテストをしてみるとうまくいくのですが、MFCプログラムにおいて同じネットワーク処理を行ってみると、サーバ側へのconnectは成功するのですが、クライアント側からsendしたときにサーバ側でrecvの戻り値が必ず0にしかならず切断された状態になってしまいます。これはどういったときに発生すると考えられるでしょうか?ちなみにMFCが絡んでいるかどうかということは特にわかっておりません。 どなたかこのような経験をお持ちであればご教授お願い致します。

  • コード中の一部を別ユーザとして処理する方法について

    コード中の一部を別ユーザとして処理する方法について solaris上でjavaプログラムを開発中です。 このプログラムはrootユーザでログインし、 起動することを想定して作成しています。 行いたいことはこのコード中の一部を 別ユーザが実行したように処理をしたいのです。 例をあげると public static void main(String[] args) { func_01(); func_02(); func_03(); func_ZZ(); // root以外のユーザが実行したものとしたい } 上記のように、一部のメソッドを root以外のユーザがコールしたものとして 処理したいのです。 solarisコマンド上でなら 1.rootでログインする 2.「su -c test.sh other_user」のコマンドを発行する。 といった感じになるでしょうか。 メソッドをコールするかシェルを起動するかの違いはありますが・・・。 もしご存知かたがいらっしゃいましたら ご教示のほう、よろしくお願いいたします。

  • AWT Frameを利用するプログラムのmainメソッドを含むクラスについて

    AWTのFrameを継承してWindowプログラムを作成する際に、どんな書籍のサンプルプログラムを見ても、メインクラスがFrameを継承し、その中にmainメソッドが有って、そのmainメソッド内で自分自身のクラスのインスタンスを作成してshowする、といった事を定石のように行っています。 しかし私が思うに、mainメソッドなど含まずFrameを継承してWindow周りの処理を純粋に行うクラスを作成し、プログラムのメインとなるクラス内のmainメソッドからFrameを継承した別クラスのインスタンスを作成・showする方が、よほどスッキリして理解し易いような気がするのですが、どうなんでしょ? そういったサンプルプログラムを作成してみましたが問題なく動作します。ただそういう事をやっている他のサンプルソースが見当たらないので、何となく不安です(笑)

    • ベストアンサー
    • Java
  • 4人プレイの七並べGAMEを作りたいのですが。初心者です。

    初心者です。宜しくお願いします。 4人プレイで内3人がコンピュータ。というトランプゲーム(七並べ)をつくりたいのですが、3人のコンピュータ自動処理後の 自分で選んでイベント待ち状態?をつくるにはどうしたらいいのかわかりません。 (参考) run(){ while(flag == true){ 1P処理のメソッド();  //COM1   2P処理のメソッド();  //COM2   3P処理のメソッド();  //player   4P処理のメソッド();  //COM3    thread.sleep(3000); かなりはしょっての説明で恐縮ですが、 この3Pの場所で、マウスでカードを選びクリックするまでストップさせたいんです。選んでクリックするとまた4P→1P→2P・・・と動作させたいのですが、どうすればいいのかわからず質問しました。 今の地点の動きは、1Pの処理(3秒)→2Pの処理(3秒)→3Pの処理(3秒内で選んでクリックしないとプログラムストップ)→4Pの繰り返しになっています。3Pの場面でrunメソッド内のwhileのフラグをfalseにしてマウスイベントのメソッドを別フラグでtrueにし、クリックしたらまたrunメソッド内のwhileのフラグをfalseに戻すという処理でかろうじて動いているのですが、普通の方法というか、なにかいい方法教えてください。お願いします。

専門家に質問してみよう