問題タブ [objectoutputstream]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
7343 参照

java - Android プラットフォームで Bluetooth ソケットの InputStream を使用して ObjectInputStream を作成できない

Android 携帯用のマルチプレイヤー ゲームを作成しています。通信はBluetooth経由です。入力/出力ストリームを使用して、ある電話から別の電話にバイトを送信することができました。オブジェクトを転送できるようにする必要があるため、オブジェクトストリームが必要です。しかし、ストリームを使用して Objectstream を作成しようとすると、プログラムが命令でハングします。

//命令 new ObjectInputStream(mmInStream) は決して実行を終了しません。私はそれをキャッチするので、エラーをスローしていないようです。この命令でハングするだけです。この行より下のコードは実行されません。

私は何を間違っていますか?

0 投票する
2 に答える
1437 参照

java - 多くの接続を受け入れなければならないときに、クライアント/サーバー タイプのアプリケーションで Java ソケットに問題があります。

まず、お読みいただきありがとうございます。ユーザーとしてスタックオーバーフローに参加するのはこれが初めてですが、常にそれを読んで有用な解決策を見つけました:D。ところで、説明が不十分で申し訳ありませんが、私の英語はあまり上手ではありません。

私のソケットベースのプログラムは奇妙な動作をしており、いくつかのパフォーマンスの問題があります。クライアントとサーバーは、シリアル化されたオブジェクトをオブジェクトの入力ストリームと出力ストリームにマルチスレッドで読み書きすることによって、相互に通信します。コードの基本をお見せしましょう。読みやすいように簡略化しました。たとえば、完全な例外処理は意図的に省略されています。サーバーは次のように機能します。

サーバ:

LjServerThread クラス、クライアントごとに 1 つのインスタンスが作成されます。

そして、クライアントは次のようになります。

ご覧のとおり、サーバー側で受け入れられたクライアントを処理する LjServerThread クラスは、所要時間を測定します... 通常、75 ~ 120 ミリ秒かかります (x は IP です)。

  • クライアント x は正常に終了しました。
  • 実行時間: 82
  • クライアント x は正常に終了しました。
  • 実行時間: 80
  • クライアント x は正常に終了しました。
  • 実行時間: 112
  • クライアント x は正常に終了しました。
  • 実行時間: 88
  • クライアント x は正常に終了しました。
  • 実行時間: 90
  • クライアント x は正常に終了しました。
  • 実行時間: 84

しかし、突然、予測可能なパターンはありません (少なくとも私にとっては):

  • クライアント x は正常に終了しました。
  • 実行時間: 15426

時には25秒に達する!時折、スレッドの小さなグループが少し遅くなることがありますが、それはあまり心配していません:

  • クライアント x は正常に終了しました。
  • 実行時間: 239
  • クライアント x は正常に終了しました。
  • 実行時間: 243

なぜこうなった?これはおそらく、サーバーとクライアントが同じ IP を持つ同じマシンにあるためでしょうか? (このテストを行うために、サーバーとクライアントを同じマシンで実行しますが、それらはインターネット経由で接続し、パブリック IP を使用します)。

これは私がこれをテストする方法です。main() で次のようにサーバーに要求します。

「Thread.sleep(100)」を使用せずにループで実行すると、接続リセットの例外が発生します (400 のうち 7 または 8 の接続が多かれ少なかれリセットされます)。 () が接続を受け入れると、serverSocket.accept() に再び到達するまでに非常に短い時間がかかります。その間、サーバーは接続を受け入れることができません。そのせいでしょうか。そうでない場合、なぜですか?サーバーにまったく同時に 400 の接続が到着することはめったにありませんが、発生する可能性があります。「Thread.sleep(100)」がないと、タイミングの問題も悪化します。

前もって感謝します!


更新しました:

なんてばかだ、私はローカルホストでそれをテストしました...そしてそれは何の問題も与えません! 「Thread.sleep(100)」の有無にかかわらず、問題なく動作します。どうして!したがって、ご覧のとおり、接続のリセットがスローされる理由についての私の理論は正しくありません。これは物事をさらに奇妙にします!誰かが私を助けてくれることを願っています...ありがとう!:)


更新 (2):

さまざまなオペレーティング システムで、まったく異なる動作が見られることを発見しました。私は通常、Linux で開発を行っており、説明した動作は、私の Ubuntu 10.10. Windows 7 では、接続間で 100 ミリ秒一時停止すると、すべて問題なく、すべてのスレッドが高速で点灯し、150 ミリ秒以上かかることはありません (低速接続の問題はありません!)。これは Linux で起こっていることではありません。ただし、「Thread.sleep(100)」を削除すると、一部の接続のみが接続リセット例外を取得するのではなく、すべてが失敗して例外がスローされます (Linux ではそれらの一部のみ、400 のうち 6 程度)。失敗していました)。

ふぅ!OS だけでなく、JVM 環境にも少し影響があることがわかりました。大したことではありませんが、注目に値します。私は Linux で OpenJDK を使用していましたが、現在、Oracle JDK では、接続間のスリープ時間を短縮すると、以前に失敗し始めることがわかります (50 ミリ秒で OpenJDK は正常に動作し、例外はスローされませんが、Oracle のものではかなり多くは 50ms のスリープ時間で動作しますが、100ms では正常に動作します)。

0 投票する
1 に答える
2811 参照

java - ObjectOutputStreamおよびjava.io.StreamCorruptedException

ObjectOutputStreamを使用してクライアントからサーバーにカスタムオブジェクト(Content.javaを参照)を送信しようとすると、最初のオブジェクトが送信された後にStreamCorruptedExceptionが発生します。したがって、別のオブジェクトを送信しようとすると、例外が発生します(これは初めて機能します)。私はグーグルでたくさんのことを読みました、そして今私はあきらめようとしているので、私はあなたの助けを求めます。

Client.java

Content.java

スタック:

編集:ClientActivity.javaClientActivity.javaを追加しました

}

Server.java

Connection.java

ServerActivity.java

0 投票する
3 に答える
217 参照

java - オブジェクトの入出力ストリームを使用してソケットを介して送信するオブジェクトのサイズは本当に重要ですか?

一連のオブジェクト書き込み後にストリームをフラッシュするよりも、 ObjectOutputStream#writeObjectを個別に呼び出した後にOutputStreamをフラッシュする方が効率的ですか?(例:オブジェクトを書き込んで4回フラッシュするか、4回書き込んでから1回だけフラッシュするか?)

ObjectOutputStreamは内部でどのように機能しますか?

0 投票する
4 に答える
43724 参照

java - JSONObject はシリアライズできませんか?

JSONObjects の ArrayList をシリアル化しようとしています。しかし、私はエラーが発生します:

これが私のシリアライズとデシリアライズのコードです:

0 投票する
1 に答える
1195 参照

java - java:実行時にファイルサイズを追跡し続けますか?

圧縮されたオブジェクトをファイルに書き込むコードを作成しました。質問は、オブジェクトが書き込まれるときにファイルのサイズの増分を追跡できる方法はありますか?これが私のコードです:

flush毎回使用してから、を使用oos.writeObject(str);してファイルサイズを取得しようとしましoutFile.length()たが、どれだけフラッシュしても、ファイルサイズは最後に最終サイズにジャンプするまで変更されません。とにかく私はそれを修正することができましたか?ありがとう

0 投票する
2 に答える
2546 参照

java - ObjectOutputStreamを使用してオブジェクトを返します

ObjectOutputStreamを使用してオブジェクトを返すと主張されているJavaコードのセグメントを見つけました

responseはHttpServletResponseオブジェクトです。このコードセグメントがどのように機能し、どのようにテストするのか知りたいですか?

0 投票する
1 に答える
151 参照

java - IonotseriaizableException が発生し続けます。何が間違っていましたか?

だから、私は次の属性を持つクラスを持っています

これらはすべて既に初期化されており、その上に宣言されています public class Motor extends AbstractTableModel implements Serializable が、ObjectOutputStream を使用するとまだ IONotSerializableException が発生します。これが理由であることがわかっているいくつかの制限がありますか?

0 投票する
1 に答える
5035 参照

java - 直列化可能クラスのエラー

Androidで開発されたクライアントにソケットを介してデータを送信するJavaサーバーがあります。送信されたデータはシリアル化されます...そしてクライアント側で ObjectInputStream から読み込もうとすると、次のエラーが発生します:

サーバー側のコードは次のとおりです。

クライアント側では、これがあります:


そして、これがクライアント側とサーバー側の両方にあるシリアライズ可能なクラスです。


このクラスのインスタンスは、ソケットを介して送信しているものです。


編集:

サーバーには次のものがあります:

パッケージサーバー;

java.io.Serializable をインポートします。

public class Coordinate は Serializable を実装します{

クライアント側では、次のものがあります。

パッケージcom.Server_1;

java.io.Serializable をインポートします。

public class Coordinate は Serializable を実装します{

両方でパッケージを同じに変更する方法がわかりません!!!!!!