4

Java ソケットを使用して単純なクライアント/サーバー アプリケーションを構築し、ObjectOutputStream などを試しています。

私は、この URL http://java.sun.com/developer/technicalArticles/ALT/socketsのチュートリアルに従っています。ソケットを介したオブジェクトのトランスポートについて話しているときは、途中から始まります。

クライアントのコードを参照してくださいhttp://pastebin.com/m37e4c577ただし、これは機能していないようで、何が機能していないのかわかりません。一番下にコメントアウトされているコードは、チュートリアルから直接コピーされたものです。これは、クライアント オブジェクトを作成する代わりにそれを使用するだけで機能します。

誰でも私が間違っていることを見ることができますか?

4

6 に答える 6

7

問題は、ストリームを作成する順序です。

この記事のサーバー(私が使用しているものだと思います)では、新しい接続が開かれると、サーバーは最初に入力ストリームを開き、次に出力ストリームを開きます。

public Connect(Socket clientSocket) {
 client = clientSocket;
 try {
  ois = new ObjectInputStream(client.getInputStream());
  oos = new ObjectOutputStream(client.getOutputStream());
 } catch(Exception e1) {
     // ...
 }
 this.start();
}

コメント付きのサンプルコードは逆の順序を使用しており、最初に出力ストリームを確立し、次に入力ストリームを確立します。

// open a socket connection
socket = new Socket("localhost", 2000);
// open I/O streams for objects
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());

しかし、あなたのコードはそれを逆に行います:

server = new Socket(host, port);
in = new ObjectInputStream(server.getInputStream());
out = new ObjectOutputStream(server.getOutputStream());

出力ストリームと入力ストリームのペアを確立すると、ハンドシェイク情報を交換するまで停止するため、作成の順序を一致させる必要があります。これは、サンプルコードの34行目と35行目を入れ替えるだけで実行できます。

于 2009-01-23T12:01:15.823 に答える
5

オブジェクトをどこにも書いていません。

あなたが書かなければならない場所に、そのリンクをもう一度見てください:

 oos.writeObject( new Date() );

あなたのコードにはあなただけがあります

ois.readObject();

それが理由です

于 2009-01-22T23:59:18.277 に答える
2

outputStream出力ストリームがブロックされないため、を開くことをお勧めします。次に、を待機する入力ストリームがありますStream。すべてのストリームの後、ストリームに書き込み、それをフラッシュしてoutputStream.flush()、データのバイトを送信します。入力を読み取るためのもう一方の側のメソッドも必要になります。これは、単純inputStream.read()にすべてのバイトを a の整数として読み取るかchar、 または を使用して読み取るBufferedReaderScannerです。考えられるほとんどすべての方法を使用しましたが、送信に最も効果的な方法outputStream.write(String)は、一連のchars を s としてbyteストリームにinputStream.read()書き込み、単一の を読み取る方法charです。これが役立つことを願っています。

于 2014-10-07T05:42:51.863 に答える
2

デバッガーを試してみれば、どこに問題があるかがわかったはずです (おそらく理由ではないでしょう)。

問題は、ObjectOutputStream がヘッダーを書き込み、ObjectInputStream がそのヘッダーを読み取ることです。最初に ObjectInputStream を作成しました。これは、書き込まれることのないヘッダーを読み取ろうとしていることを意味します。

解決策: 常に最初に ObjectOutputStream を作成し、それを flush() してから ObjectInputStream を作成します。

于 2009-01-23T07:22:29.333 に答える