[過去ログ]
Javaで作るスタンドアローンゲーム (484レス)
Javaで作るスタンドアローンゲーム http://mevius.5ch.net/test/read.cgi/gamedev/1356591858/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
366: 名前は開発中のものです。 [sage] 2014/11/25(火) 08:11:55.29 ID:mNAq4UK+ ソース見た。 エラーの原因は、サーバ側では送信のたびにObjectOutputStreamを作り直してるのに、クライアント側では同じObjectInputStreamを使い続けていることだ。 作り直すなら両方とも作り直す(この場合resetは要らない)、使い続けるなら両方とも使い続ける。混ぜてはいけない。 あと、現時点では大丈夫かもしれないが、潜在的な問題がある。 受信がブロックするのは当然なので別スレッドにするのは自然だけど、実は送信もブロックするから別スレッドにした方がいいんだ。 TCPには一定サイズのバッファがあって、相手側が読み出してくれなければ、バッファが一杯になった時点でそれ以上書き込めなくなり、ブロックする。 相手側が読み出してるつもりでも、例えば何かネットワークのトラブルでデータが届かなくなれば、同じようになる。 サーバ側で synchronized (this.recvMessageQueue) { } の中で sendClients 呼んでその中で writeObject してるけど、こういうロックを握ったままブロックする可能性があるのは非常によくない。 受信キューを握ったままブロックすると受信スレッドがみんな動けなくなるし、そうなるといずれクライアントの送信側もバッファが一杯になってみんな止まってしまう。 あとは、 clientSocketList が複数のスレッドから読み書きされてるから synchronized するべき。 いちいち synchronized するのが面倒なら元からスレッドセーフな CopyOnWriteArrayList を使うという手もある。 キューも LinkedBlockingQueue とか使えば synchronized する必要なくなる。 まぁこのへんはどっちでもいいけど。 ObjectIOストリームは、性能面では劣るけど、開発は楽だから、使いたければそれでいいんじゃない。 他の方法といっても、ファイルと一緒で、フォーマットを決めて読み書きするだけだよ。 いわゆるType-Length-Value的なやり方が普通だと思うけど、例えば文字列化して行単位で送るとか、XML形式で送るという方法もなくはない。 こういうのは性能やらメンテナンス性やら開発速度やらのトレードオフだから、好みの方法を使えばいいと思うよ。 http://mevius.5ch.net/test/read.cgi/gamedev/1356591858/366
367: 348 [sage] 2014/11/26(水) 18:49:10.33 ID:yQ5yK0Ih >>366 添削ありがとうございます。とりあえず基本的な通信周りは動くようになりました。 エラーの原因は結局の所Streamの基本的な利用方法を理解していなかったことであり大変お恥ずかしい限りです。 受信以外に送信もスレッド化しなくてはならないとなると、1クライアント接続毎に2スレッド起動することになるのですね。 100の接続があれば200、1000の接続があれば2000も起動するということで、今後仕様に耐えられるか心配ではあります。 364の方が仰るようなバグの内包は自分はやらかしそうなので。 こういったミスがなくなるよう、通信周りで信頼性の高い実装済みのフレームワークを利用したいと切に願います。 ともあれ、ようやく動くようになりました。ありがとうございました。 http://mevius.5ch.net/test/read.cgi/gamedev/1356591858/367
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.094s