ソース見た。
エラーの原因は、サーバ側では送信のたびにObjectOutputStreamを作り直してるのに、クライアント側では同じObjectInputStreamを使い続けていることだ。
作り直すなら両方とも作り直す(この場合resetは要らない)、使い続けるなら両方とも使い続ける。混ぜてはいけない。
あと、現時点では大丈夫かもしれないが、潜在的な問題がある。
受信がブロックするのは当然なので別スレッドにするのは自然だけど、実は送信もブロックするから別スレッドにした方がいいんだ。
TCPには一定サイズのバッファがあって、相手側が読み出してくれなければ、バッファが一杯になった時点でそれ以上書き込めなくなり、ブロックする。
相手側が読み出してるつもりでも、例えば何かネットワークのトラブルでデータが届かなくなれば、同じようになる。
サーバ側で synchronized (this.recvMessageQueue) { } の中で sendClients 呼んでその中で writeObject してるけど、こういうロックを握ったままブロックする可能性があるのは非常によくない。
受信キューを握ったままブロックすると受信スレッドがみんな動けなくなるし、そうなるといずれクライアントの送信側もバッファが一杯になってみんな止まってしまう。
あとは、 clientSocketList が複数のスレッドから読み書きされてるから synchronized するべき。
いちいち synchronized するのが面倒なら元からスレッドセーフな CopyOnWriteArrayList を使うという手もある。
キューも LinkedBlockingQueue とか使えば synchronized する必要なくなる。 まぁこのへんはどっちでもいいけど。
ObjectIOストリームは、性能面では劣るけど、開発は楽だから、使いたければそれでいいんじゃない。
他の方法といっても、ファイルと一緒で、フォーマットを決めて読み書きするだけだよ。
いわゆるType-Length-Value的なやり方が普通だと思うけど、例えば文字列化して行単位で送るとか、XML形式で送るという方法もなくはない。
こういうのは性能やらメンテナンス性やら開発速度やらのトレードオフだから、好みの方法を使えばいいと思うよ。
探検
Javaで作るスタンドアローンゲーム
■ このスレッドは過去ログ倉庫に格納されています
366名前は開発中のものです。
2014/11/25(火) 08:11:55.29ID:mNAq4UK+■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【野球】大谷翔平、WBC出場を正式表明! 「日本を代表して再びプレー嬉しく思う」 侍ジャパンで世界一連覇狙う★2 [冬月記者★]
- 🇺🇸🇨🇳米中関係は「極めて強固」とトランプ氏… ★3 [BFU★]
- 🇺🇸🇨🇳米中関係は「極めて強固」とトランプ氏… ★4 [BFU★]
- 日米首脳、電話で緊密な連携確認 台湾答弁協議の有無明言せず… [BFU★]
- きょう日米電話首脳会談で調整…トランプ大統領が中国・習主席との電話会談受け高市首相に説明か 台湾問題の認識は… [ぐれ★]
- 「ホストに貢ぎたい」と海外で売春する日本人女性 2カ月で2千万円稼ぐケースも [1ゲットロボ★]
- 【高市悲報】習近平「先の日中戦争戦勝国として仲良くやろや🤗」トランプ「せやな」世界が日本から孤立していく😨 [359965264]
- 高市早苗、トランプに電話会談でガチギレされた模様wwwwwwwwwwwww会見で半泣きだったという情報も [271912485]
- 【悲報】JR北海道「廃線跡にメガソーラー敷きます☺」ネトウヨ「中国のパネル使って環境破壊はやめろ!」 [616817505]
- 高市、国連の全ての加盟国に「私悪くないもん」という趣旨の迷惑メールを送付 [931948549]
- 【あっ…】トランプと習近平、ガッツリ握手。高市早苗、ガチで終了。 [153490809]
- 職場にヤバい奴がいるwwwwww
