socket接続をして画面遷移するときエラー

538 views
Skip to first unread message

龍一

unread,
Nov 21, 2013, 2:25:21 AM11/21/13
to android-g...@googlegroups.com
パソコンとandroid端末とのsocket通信をやっています。

以下の3つのクラスを作成します。

1)staticなsocketを置いておくクラス
public class MainSocket() {
 public static Socket socket;
}

2)MainActivity
ここで、
InetAddress inetAddress = InetAddress.getByName(wifiIpAdress);
MainSocket.socket = new Socket(ip,port,inetAddress,port);
などをして接続を確立させて通信する。

3)SubActivity
MainActivityから移動するクラス
ここでも通信する。

というのを3つ作成してみました。

MainActivity上では、接続、送信、受信が行えるのですが、
画面遷移してSubActivity上で送信しようとするとだと切断になってしまいます。close() などはしていません。

MainActivity上で接続を確立させたので、それをそのままSubActivityで利用しようとするとエラーになるようです。

画面遷移するとソケットはなんだかおかしくなるのでしょうか?
それともsocketの使い方が間違っているのでしょうか?

=============================================

11-21 16:10:31.682: W/System.err(8942): java.net.SocketException: Socket closed
11-21 16:10:31.692: W/System.err(8942): at libcore.io.Posix.sendtoBytes(Native Method)
11-21 16:10:31.692: W/System.err(8942): at libcore.io.Posix.sendto(Posix.java:155)
11-21 16:10:31.692: W/System.err(8942): at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
11-21 16:10:31.692: W/System.err(8942): at libcore.io.IoBridge.sendto(IoBridge.java:466)
11-21 16:10:31.692: W/System.err(8942): at java.net.PlainSocketImpl.write(PlainSocketImpl.java:507)
11-21 16:10:31.692: W/System.err(8942): at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)
11-21 16:10:31.692: W/System.err(8942): at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:269)
11-21 16:10:31.692: W/System.err(8942): at java.io.OutputStream.write(OutputStream.java:82)

三宅義之

unread,
Nov 21, 2013, 2:38:25 AM11/21/13
to android-g...@googlegroups.com
おせわになります。

私も同じようなことをやっていますが、画面遷移にておかしくなることはありません。

SubActivityはどのように使用してますか?
結局、別プロセス(?)なんでインスタンスを別で生成し、接続しなければならないような。

2013年11月21日木曜日 16時25分21秒 UTC+9 龍一:
Message has been deleted

龍一

unread,
Nov 21, 2013, 2:49:41 AM11/21/13
to android-g...@googlegroups.com
返信ありがとうございます。

ということは、

MainActivity で接続を確立させたとしても
SubActivity ではプロセスが別になるので socketの再接続、確立が必要ということでしょうか?

僕は

「MainActivity でソケットを確立させて、ついでにInputstreamとOutputStreamも作っちゃえ。
そんでもってそれをstaticにすれば、これを使ってどこからでもサーバーとやりとりできるぜウホホーイ」

とか調子のいいことを考えていましたが、それはできないということでしょうか?

niboshi

unread,
Nov 21, 2013, 8:35:26 AM11/21/13
to android-g...@googlegroups.com
問題の解決になるかはわかりませんが、serializableでないオブジェクトをActivity間で共有する場合は
Applicationクラスに持たせるのがスマートです。

アウトラインは以下
・Applicationクラスを継承した独自クラスに、Applicationスコープで持ちたいメンバ(今回はSocket型)を定義する。
・AndroidManifest.xmlのapplication要素にこのクラスを指定する。
・Activity.getApplication()でApplicationオブジェクトを取り出し、(ダウンキャストして)メンバにアクセスする。


2013年11月21日木曜日 16時49分41秒 UTC+9 龍一:

龍一

unread,
Nov 21, 2013, 7:59:19 PM11/21/13
to android-g...@googlegroups.com
返信ありがとうございます、いちおう Activity.getApplication() を使用してsocketを渡してみたのですが、切断してしまいました。

いろいろ試しては見たのですが、解決方法は 「そのアクティビティ内で接続、クローズ」してアクティビティごとにsocketの再接続を行う事で対処しました。

やる方法はあるとは思うのですが、、、

Hiroaki GOTO as GORRY

unread,
Nov 22, 2013, 12:31:34 AM11/22/13
to android-g...@googlegroups.com

後藤 浩昭(GORRY)です。

ソケットを扱うような処理は「サービス」に括り出し、
アクティビティはそれと通信するように設計すると楽になります。
http://developer.android.com/intl/ja/reference/android/app/Service.html


In message <04099edd-0e87-4cf3...@googlegroups.com>
"[android-group-japan: 25440] Re: socket接続をして画面遷移するときエラー"
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
Hiroaki GOTO as "GORRY" : 後藤 浩昭
EMAIL: gorr...@gmail.com
Reply all
Reply to author
Forward
0 new messages