0

サーバーを実装しようとしていますが、メッセージを受信すると次のようになります。

try{
       ObjectInputStream is = new ObjectInputStream(clientSocket.getInputStream());
       String message = (String)is.readObject();
       ActivateCommand(message,clientSocket);
       is.close();
    }

およびActivateCommand:

private void ActivateEwolfCommand(String msg, Socket clientSocket) throws IOException 
{
    ObjectOutputStream os = new ObjectOutputStream(clientSocket.getOutputStream());
    Gson gsonObject = new Gson();
    .
    //code which makes a Json string
    .
    os.writeObject(json);
os.close();
}

今、junitテストでローカルホストにメッセージを送信してテストしたところ、機能しました。しかし、C#クライアントからサーバーに接続しようとすると、クライアントは接続しましたが、clientSocket.getInputStream()のポイントに到達すると、サーバーはEOF例外をスローします。メッセージがいつ終了するかをサーバーが知らなかったために発生したと思いますが、それが実際に当てはまるかどうかはわかりません。そうである場合は、どうすれば修正できますか?

4

3 に答える 3

0

InputStreamtoで利用可能なデータがなくなるread()と、基本的にEOFが発生します。使用可能なデータの量は、クライアントによって決定されます。クライアントがソケット側に書き込むデータは、サーバー側のソケットにOutputStream そのように表示されます。InputStreamを呼び出しInputStream.available()て、まだ存在する可能性のあるバイト数の見積もりを取得できますread()

ただし、コードはObjectInputStreamを使用してオブジェクトを読み取ろうとしています-このクラスには、シリアル化されたバイトストリームを読み取り、それをオブジェクトに変換する独自のプロトコルがあります-タスクを完了するためのバイトが見つからない場合、EOF例外がスローされる可能性があります。クライアントがC#の場合、シリアル化されたオブジェクトに対してこれが書き込むバイトの形式はObjectInputStream、サーバー側で期待されるものとは明らかに異なります。

于 2012-05-29T21:36:18.250 に答える
0

これが、ソケットとオブジェクト ストリームを使用して独自のクライアント サーバー プロトコルを作成するのが悪い考えである理由です。多くの人が何年もかけてあなたを連れてきました。

  • 石鹸
  • 休み
  • RMI
  • ヘシアン
  • コルバ
  • 倹約

そしてそこにある他の多数のプロトコル。フレーミングのすべての問題を含め、5 つまたは 6 つではなくても、そのうちの 1 つが問題を解決するのに十分です。

于 2012-05-29T21:39:55.530 に答える
0

ソケットを介して文字列を送信する場合、ObjectInputStreamorObjectOutputStreamは適切なストリーム実装ではありません。これらのストリーム実装は、Java オブジェクトのシリアル化を使用します。インスタンスをシリアル化してもString、結果のバイトは、適切な文字エンコーディングを使用したプレーン文字列からバイトへの変換と同じではありません。

また、C# アプリケーションは Java のシリアル化をまったく理解していません。

PrintWriterを使用してストリームに文字列を書き込み、BufferedReaderを読み取りに使用することを検討してください。

PrintWriter writer = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream(), "UTF-8"));
writer.println(...);


BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), "UTF-8"));
String line = reader.readLine();

その後、文字列を 1 行ずつ読み書きできます。これは出発点にすぎません。独自のプロトコルを実装する場合は、さらにいくつかの点に注意する必要があります。例として、 POP3FTPHTTP 1.0などの一部の TCP プロトコルの仕様を読むことができます。

于 2012-05-29T21:50:38.923 に答える