Swing Application FrameworkでSocketが作成できない。

View: New views
8 Messages — Rating Filter:   Alert me  

Swing Application FrameworkでSocketが作成できない。

by harada :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

はじめまして.

 情報が見つからないので、バグなのかよくわからないのですが、
Java Desktop Application(Swing Application Framework)で
Socketをnewするとそのままwait状態で何も操作できなくなってしまいます。


[再現方法]
 New ProjectでBasic Applicationを作成したあとfileMenuにMenuItemを追加し、Labelを1つ
追加した状態にして、event処理を追加して

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
        // test
        try {
        jLabel1.setText("start");
        jLabel1.paintImmediately(jLabel1.getVisibleRect());
        java.net.Socket socket = new java.net.Socket(適当なサーバ, 80);
        jLabel1.setText("OK");
        jLabel1.paintImmediately(jLabel1.getVisibleRect());
        }
        catch (Exception e) {
        jLabel1.setText("Exception:" + e.getMessage());
        jLabel1.paintImmediately(jLabel1.getVisibleRect());
        }
    }
とするとItemを選ぶとstartと表示したまま何も操作できなってしまいます。
 固まった状態でスレッドダンプをとると、
"AWT-EventQueue-0" prio=6 tid=0x02b66400 nid=0x100 runnable
[0x0405f000..0x0405f
a14]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at java.net.SocksSocketImpl.readSocksReply(SocksSocketImpl.java:85)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:429)
        at java.net.Socket.connect(Socket.java:519)
        at java.net.Socket.connect(Socket.java:469)
        at java.net.Socket.<init>(Socket.java:366)
        at java.net.Socket.<init>(Socket.java:180)
        at test.TestView.jMenuItem1ActionPerformed(TestView.java:218)
        at test.TestView.access$800(TestView.java:22)
        at test.TestView$4.actionPerformed(TestView.java:144)
        at
javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:19
95)
となっています。

 私の環境は以下のようになっています。

Product Version: NetBeans IDE 6.0 (Build 200711261600)

Java: 1.6.0_03; Java HotSpot(TM) Client VM 1.6.0_03-b05

System: Windows XP version 5.1 running on x86; MS932; ja_JP (nb)


以上


---------------------------------------------------------------------
To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@...
For additional commands, e-mail: nbdiscuss_ja-help@...


Re: Swing Application FrameworkでSocketが作成できない。

by Takayuki Okazaki :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

こんにちは。

Swingは下記のようなActionPerformedのようなイベントを
イベント処理専用のスレッドで実行します。このため、Socketを
開く等、イベント処理スレッドを止めてしまうと、Swingアプリ全体が
イベントを処理できなくなります。

今回のように、Socketを使ったり、その他"重たい"処理をしたいので
あれば別のスレッドにその処理を委譲する方法を選択するのが
Swing流になります。

スレッドを直接扱うのは面倒なので、SwingWorkerという
クラスを利用するのがいい方法だと思います。Java SE 6なら
標準で入っています。

http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/SwingWorker.html

それ以前のJDKの場合は別途ダウンロードして、クラスパスに
追加して利用できます。

https://swingworker.dev.java.net/

ご参考まで。

岡崎

harada さんは書きました:

> はじめまして.
>
>  情報が見つからないので、バグなのかよくわからないのですが、
> Java Desktop Application(Swing Application Framework)で
> Socketをnewするとそのままwait状態で何も操作できなくなってしまいます。
>
>
> [再現方法]
>  New ProjectでBasic Applicationを作成したあとfileMenuにMenuItemを追加
> し、Labelを1つ
> 追加した状態にして、event処理を追加して
>
>    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
>        // test
>        try {
>        jLabel1.setText("start");
>        jLabel1.paintImmediately(jLabel1.getVisibleRect());
>        java.net.Socket socket = new java.net.Socket(適当なサーバ, 80);
>        jLabel1.setText("OK");
>        jLabel1.paintImmediately(jLabel1.getVisibleRect());
>        }
>        catch (Exception e) {
>        jLabel1.setText("Exception:" + e.getMessage());
>        jLabel1.paintImmediately(jLabel1.getVisibleRect());
>        }
>    }
> とするとItemを選ぶとstartと表示したまま何も操作できなってしまいます。
>  固まった状態でスレッドダンプをとると、
> "AWT-EventQueue-0" prio=6 tid=0x02b66400 nid=0x100 runnable
> [0x0405f000..0x0405f
> a14]
>   java.lang.Thread.State: RUNNABLE
>        at java.net.SocketInputStream.socketRead0(Native Method)
>        at java.net.SocketInputStream.read(SocketInputStream.java:129)
>        at java.net.SocksSocketImpl.readSocksReply(SocksSocketImpl.java:85)
>        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:429)
>        at java.net.Socket.connect(Socket.java:519)
>        at java.net.Socket.connect(Socket.java:469)
>        at java.net.Socket.<init>(Socket.java:366)
>        at java.net.Socket.<init>(Socket.java:180)
>        at test.TestView.jMenuItem1ActionPerformed(TestView.java:218)
>        at test.TestView.access$800(TestView.java:22)
>        at test.TestView$4.actionPerformed(TestView.java:144)
>        at
> javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:19
> 95)
> となっています。
>
>  私の環境は以下のようになっています。
>
> Product Version: NetBeans IDE 6.0 (Build 200711261600)
>
> Java: 1.6.0_03; Java HotSpot(TM) Client VM 1.6.0_03-b05
>
> System: Windows XP version 5.1 running on x86; MS932; ja_JP (nb)
>
>
> 以上
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@...
> For additional commands, e-mail: nbdiscuss_ja-help@...
>

---------------------------------------------------------------------
To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@...
For additional commands, e-mail: nbdiscuss_ja-help@...


Parent Message unknown Re: Swing Application FrameworkでSocketが作成できない。

by harada :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

原田です

 返事が遅くなり申し訳あありません。
 別スレッドにして試したのですが、画面が固まることはないですが、
処理はstartのままで改善されません。
 ☆の行を削除するとOKとなります。

 ちなみに現在の私のプログラムは通常のApplicationで作って
同じ処理を行っていますが、それで問題なく動作しています。

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
        // test
        MyThread t = new MyThread();
        t.start();
        Thread.yield();
    }

    private class MyThread extends Thread {
        private MyThread() {

        }
        public void run() {
            try {
                jLabel1.setText("start");
                jLabel1.paintImmediately(jLabel1.getVisibleRect());
☆             java.net.Socket socket = new java.net.Socket(適当なURL, 80);
                jLabel1.setText("OK");
                jLabel1.paintImmediately(jLabel1.getVisibleRect());
            }
            catch (Exception e) {
            jLabel1.setText("Exception:" + e.getMessage());
            jLabel1.paintImmediately(jLabel1.getVisibleRect());
            }
        }
    }

 以上


---------------------------------------------------------------------
To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@...
For additional commands, e-mail: nbdiscuss_ja-help@...


Re: Swing Application FrameworkでSocketが作成できない。

by shin-6 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

ども原田さん。shinsanと申します。

横からつっこみさせていただきます。


これは確かにマルチスレッドではありますが、プロパティの変更を外部スレッドから
行うことになるのでいわゆる危険なコードになります。

AWTイベント用のスレッドがありまして、その上でキューに突っ込んで実行してもらわ
なくてはいけません。

SwingWorkerを使いたくないのなら
javax.swing.SwingUtilities#invokeAndWaitを使うといいでしょう。これはAWTスレッド
のキューに突っ込んで、それが実行完了されるまで待つという命令です。


Socket部分でとまっているということですが、同じようにイベント内でソケット接続
させてみましたがが、問題はありませんでした。

java.net.Socket socket = new java.net.Socket("www.google.co.jp", 80);
これでいいのですよね?
クライアントソケットですから固まることはまずないと思います。


あと、アプリケーションフレームワークを使うときはアクションイベントは
@Actionを使うのが一般的だと思います。

一応@ActionとActionPerformedと両方試しましたが問題はありませんでした。



ところでDesktopApplicationFrameworkで生成されるEntityが他のプロジェクトと違い
ますね。プロパティイベントを生成してくれるので非常に便利です。ですが、他の
プロジェクトでこの生成方法がないのはちょっと困り者です。

これはウィザードでプロパティイベントを生成させるかどうかいれてほしいですね。


"harada" <harada.Kazuy-02@...> wrote:

> 原田です
>
>  返事が遅くなり申し訳あありません。
>  別スレッドにして試したのですが、画面が固まることはないですが、
> 処理はstartのままで改善されません。
>  ☆の行を削除するとOKとなります。
>
>  ちなみに現在の私のプログラムは通常のApplicationで作って
> 同じ処理を行っていますが、それで問題なく動作しています。
>
>     private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
>         // test
>         MyThread t = new MyThread();
>         t.start();
>         Thread.yield();
>     }
>
>     private class MyThread extends Thread {
>         private MyThread() {
>
>         }
>         public void run() {
>             try {
>                 jLabel1.setText("start");
>                 jLabel1.paintImmediately(jLabel1.getVisibleRect());
> ☆             java.net.Socket socket = new java.net.Socket(適当なURL, 80);
>                 jLabel1.setText("OK");
>                 jLabel1.paintImmediately(jLabel1.getVisibleRect());
>             }
>             catch (Exception e) {
>             jLabel1.setText("Exception:" + e.getMessage());
>             jLabel1.paintImmediately(jLabel1.getVisibleRect());
>             }
>         }
>     }
>
>  以上
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@...
> For additional commands, e-mail: nbdiscuss_ja-help@...
>
>
>
> __________ NOD32 2735 (20071220) Information __________
>
> This message was checked by NOD32 antivirus system.
> http://canon-sol.jp/product/nd
>

---------------------------------------------------------------------
To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@...
For additional commands, e-mail: nbdiscuss_ja-help@...


Re: Swing Application FrameworkでSocketが作成できない。

by harada :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

原田です

 ありがとうございます。
invokeAndWaitはあとで検討してみます。
Java Desktop Applicationのときに

 java.net.Socket socket = new java.net.Socket("www.google.co.jp", 80);

でとまってしまうのは、私の環境だけのようですね。
Java Applicationで作成したら問題がないので、
詳しい原因をすぐに追及しようとは思わないですが、
原因がわかったらまたメールします。
(外部サーバはproxy経由になるので、上のURLだと実際は
  Exception:www.google.co.jp
 という表示になります)

     private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt)
{

の行は生成されたものなので、その前に@Actionなどを
入れるとは思っていませんでしたが、入れるようにしてみます。

以上
----- Original Message -----
From: "shin" <shinsan@...>
To: <nbdiscuss_ja@...>
Sent: Thursday, December 20, 2007 3:08 PM
Subject: Re: [nbdiscuss_ja] Swing Application FrameworkでSocketが作成できない。



> ども原田さん。shinsanと申します。
>
> 横からつっこみさせていただきます。
>
>
> これは確かにマルチスレッドではありますが、プロパティの変更を外部スレッドから
>
> 行うことになるのでいわゆる危険なコードになります。
>
> AWTイベント用のスレッドがありまして、その上でキューに突っ込んで実行してもらわ
> なくてはいけません。
>
> SwingWorkerを使いたくないのなら
> javax.swing.SwingUtilities#invokeAndWaitを使うといいでしょう。これはAWTスレッド
>
> のキューに突っ込んで、それが実行完了されるまで待つという命令です。
>
>
> Socket部分でとまっているということですが、同じようにイベント内でソケット接続
>
> させてみましたがが、問題はありませんでした。
>
> java.net.Socket socket = new java.net.Socket("www.google.co.jp", 80);
> これでいいのですよね?
> クライアントソケットですから固まることはまずないと思います。
>
>
> あと、アプリケーションフレームワークを使うときはアクションイベントは
> @Actionを使うのが一般的だと思います。
>
> 一応@ActionとActionPerformedと両方試しましたが問題はありませんでした。
>
>
>
> ところでDesktopApplicationFrameworkで生成されるEntityが他のプロジェクトと違い
> ますね。プロパティイベントを生成してくれるので非常に便利です。ですが、他の
> プロジェクトでこの生成方法がないのはちょっと困り者です。
>
> これはウィザードでプロパティイベントを生成させるかどうかいれてほしいですね。
>
>
>
> "harada" <harada.Kazuy-02@...> wrote:
>
>> 原田です
>>
>>  返事が遅くなり申し訳あありません。
>>  別スレッドにして試したのですが、画面が固まることはないですが、
>> 処理はstartのままで改善されません。
>>  ☆の行を削除するとOKとなります。
>>
>>  ちなみに現在の私のプログラムは通常のApplicationで作って
>> 同じ処理を行っていますが、それで問題なく動作しています。
>>
>>     private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent
>> evt) {
>>         // test
>>         MyThread t = new MyThread();
>>         t.start();
>>         Thread.yield();
>>     }
>>
>>     private class MyThread extends Thread {
>>         private MyThread() {
>>
>>         }
>>         public void run() {
>>             try {
>>                 jLabel1.setText("start");
>>                 jLabel1.paintImmediately(jLabel1.getVisibleRect());
>> ☆             java.net.Socket socket = new java.net.Socket(適当なURL,
>> 80);
>>                 jLabel1.setText("OK");
>>                 jLabel1.paintImmediately(jLabel1.getVisibleRect());
>>             }
>>             catch (Exception e) {
>>             jLabel1.setText("Exception:" + e.getMessage());
>>             jLabel1.paintImmediately(jLabel1.getVisibleRect());
>>             }
>>         }
>>     }
>>
>>  以上
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@...
>> For additional commands, e-mail: nbdiscuss_ja-help@...
>>
>>
>>
>> __________ NOD32 2735 (20071220) Information __________
>>
>> This message was checked by NOD32 antivirus system.
>> http://canon-sol.jp/product/nd
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@...
> For additional commands, e-mail: nbdiscuss_ja-help@...
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@...
For additional commands, e-mail: nbdiscuss_ja-help@...


Re: Swing Application FrameworkでSocketが作成できない。

by shin-6 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

どもshinsanです。

>      private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt)
> {
>
> の行は生成されたものなので、その前に@Actionなどを
> 入れるとは思っていませんでしたが、入れるようにしてみます。

@Actionやその登録は自動生成されるのでいじる必要はないです。
つまり、DesktopApplicationFrameworkを使った場合はボタンを右クリックして
イベントの生成をするということです。

引数も何もない通常のメソッドをクリックなどのイベントに割り付けることが出来ます。

今までのSwingの基本であったプロパティのイベントのとこは触らないというわけです。
プロパティの中のプロパティの一番上にあるActionというところが設定されます。

標準でQuitやShowAboutBoxなどがはいってるはずです。

つまり、GUIコンポーネントの細かい部分は従来どおりのイベントを扱いつつ
ウインドウの流れや処理等、物事の本質部分を抜き出すという意味合いが強いと
思います。



Socketに関してはとりあえずローカルに対して接続してはいかがでしょうか?
パーソナルファイアウォール等でとまっているかもしれませんし。

NetBeans付属のTomcatもインストールしてある場合、サーバータブのTomcatを
右クリックして起動してみましょう。標準でポート8084で接続できるはずです。


"harada" <harada.Kazuy-02@...> wrote:

> 原田です
>
>  ありがとうございます。
> invokeAndWaitはあとで検討してみます。
> Java Desktop Applicationのときに
>
>  java.net.Socket socket = new java.net.Socket("www.google.co.jp", 80);
>
> でとまってしまうのは、私の環境だけのようですね。
> Java Applicationで作成したら問題がないので、
> 詳しい原因をすぐに追及しようとは思わないですが、
> 原因がわかったらまたメールします。
> (外部サーバはproxy経由になるので、上のURLだと実際は
>   Exception:www.google.co.jp
>  という表示になります)
>
>      private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt)
> {
>
> の行は生成されたものなので、その前に@Actionなどを
> 入れるとは思っていませんでしたが、入れるようにしてみます。
>
> 以上

---------------------------------------------------------------------
To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@...
For additional commands, e-mail: nbdiscuss_ja-help@...


Re: Swing Application FrameworkでSocketが作成できない。

by harada :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

原田です

 Set Actionを選ぶやり方があったんですね。

 Socketの方ですが, "localhost"だとSocketを作れますが、
IPアドレスで接続しようとするとやはり同じ現象となります。
 とりあえずSwingWorker使ってみましたが、現象は同じで固まります。

 Windowsファイアーウォールを一時的に無効に
して実行してみましたが、やはり同じでした。

--------
@Action
public void test() {
  new MyThread().execute();
}
private class MyThread extends SwingWorker<Exception, Object> {
  private Exception m_exception;
  private MyThread() {
  }
  @Override
  public Exception doInBackground() {
    return(m_exception);
  }
  @Override
  protected void done() {
    try {
      jLabel1.setText("start");
      jLabel1.paintImmediately(jLabel1.getVisibleRect());
      java.net.Socket socket = new java.net.Socket();
      java.net.InetSocketAddress address = new java.net.InetSocketAddress(適当なURL, 8080);
      socket.connect(address, 1000);
      jLabel1.setText("OK");
      jLabel1.paintImmediately(jLabel1.getVisibleRect());
    }
    catch (Exception e) {
      jLabel1.setText("Exception:" + e.getMessage());
      jLabel1.paintImmediately(jLabel1.getVisibleRect());
      m_exception = e;
    }
  }
}

以上

----- Original Message -----
From: "shin" <shinsan@...>
To: <nbdiscuss_ja@...>
Sent: Thursday, December 20, 2007 6:14 PM
Subject: Re: [nbdiscuss_ja] Swing Application FrameworkでSocketが作成できない。



> どもshinsanです。
>
>>      private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent
>> evt)
>> {
>>
>> の行は生成されたものなので、その前に@Actionなどを
>> 入れるとは思っていませんでしたが、入れるようにしてみます。
>
> @Actionやその登録は自動生成されるのでいじる必要はないです。
> つまり、DesktopApplicationFrameworkを使った場合はボタンを右クリックして
> イベントの生成をするということです。
>
> 引数も何もない通常のメソッドをクリックなどのイベントに割り付けることが出来ます。
>
> 今までのSwingの基本であったプロパティのイベントのとこは触らないというわけです。
> プロパティの中のプロパティの一番上にあるActionというところが設定されます。
>
> 標準でQuitやShowAboutBoxなどがはいってるはずです。
>
> つまり、GUIコンポーネントの細かい部分は従来どおりのイベントを扱いつつ
> ウインドウの流れや処理等、物事の本質部分を抜き出すという意味合いが強いと
> 思います。
>
>
>
> Socketに関してはとりあえずローカルに対して接続してはいかがでしょうか?
> パーソナルファイアウォール等でとまっているかもしれませんし。
>
> NetBeans付属のTomcatもインストールしてある場合、サーバータブのTomcatを
> 右クリックして起動してみましょう。標準でポーート8084で接続できるはずです。
>
>
> "harada" <harada.Kazuy-02@...> wrote:
>
>> 原田です
>>
>>  ありがとうございます。
>> invokeAndWaitはあとで検討してみます。
>> Java Desktop Applicationのときに
>>
>>  java.net.Socket socket = new java.net.Socket("www.google.co.jp", 80);
>>
>> でとまってしまうのは、私の環境だけのようですね。
>> Java Applicationで作成したら問題がないので、
>> 詳しい原因をすぐに追及しようとは思わないですが、
>> 原因がわかったらまたメールします。
>> (外部サーバはproxy経由になるので、上のURLだと実際は
>>   Exception:www.google.co.jp
>>  という表示になります)
>>
>>      private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent
>> evt)
>> {
>>
>> の行は生成されたものなので、その前に@Actionなどを
>> 入れるとは思っていませんでしたが、入れるようにしてみます。
>>
>> 以上
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@...
> For additional commands, e-mail: nbdiscuss_ja-help@...
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@...
For additional commands, e-mail: nbdiscuss_ja-help@...


Re: Swing Application FrameworkでSocketが作成できない。

by harada :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

原田です

 以前Application Frameworkのアプリで
Socketを作ろうとしたら動作しなくなって件ですが、
引っ越しをして建物を替わったあと、
試すと動作するようになっていました。
 原因はわかりませんでしたが、LAN環境により
問題が発生していたようです。

以上
----- Original Message -----
From: "harada" <harada.Kazuy-02@...>
To: <nbdiscuss_ja@...>
Sent: Thursday, December 20, 2007 7:40 PM
Subject: Re: [nbdiscuss_ja] Swing Application FrameworkでSocketが作成できない。

> 原田です
>
>  Set Actionを選ぶやり方があったんですね。
>
>  Socketの方ですが, "localhost"だとSocketを作れますが、
> IPアドレスで接続しようとするとやはり同じ現象となります。
>  とりあえずSwingWorker使ってみましたが、現象は同じで固まります。
>
>  Windowsファイアーウォールを一時的に無効に
> して実行してみましたが、やはり同じでした。



---------------------------------------------------------------------
To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@...
For additional commands, e-mail: nbdiscuss_ja-help@...

LightInTheBox - Buy quality products at wholesale price!