2012-04-11 11 views
5

私は基本的にテキストメールシステムの基本的なサーバーとクライアントをセットアップしました。私は現在、PrintWriterを使ってサーバーとクライアントの間でテキストを送信しています。私は添付ファイルベースのシステムを作成しようとしており、これを行うにはObjectOutputStreamを使用しています。ObjectOutputStreamとPrintWriter Conflict

private static PrintWriter output; 
private static ObjectOutputStream outStream; 

public ClientHandler(Socket socket) throws IOException 
{ 
    client = socket; 
    outStream = new ObjectOutputStream(client.getOutputStream()); 
    input = new Scanner(client.getInputStream()); 
    output = new PrintWriter(client.getOutputStream(), true); 
} 
私は現在、キーワードを識別することはできませんプログラムを意味し、私は余分な文字が送信されたテキストの先頭に追加されますいくつかの理由で、出力のPrintWriterを経由してテキストを送信しようとした場合に問題を抱えている

が渡されますプリントライタを介してクライアントに送信する。 outStreamオブジェクトの作成をコメントアウトすると、問題は停止します。

誰も私にこの紛争の問題を解決するための助言を与えることができますか?

+0

あなたが 'PrintWriter'または' PrintStream'を使うべきではありませんI/O、およびバイナリエラー状態の代わりに、例外を我慢する用意があります。 – EJP

答えて

4

この余分なテキストは、オブジェクト出力ストリームからのものです。

ObjectOutputStreamとPrintStreamを同じ出力ストリームにアタッチすることは、基本的には決して動作しません。あなたは1つまたは他のものを使用するための解決策を考え出す必要があります。 PrintStreamだけを使用するには、オブジェクトをJSONまたはXMLに変換することを検討してください。一方、ObjectOutputStreamを使用して文字列をObjectOutputStreamに書き込むこともできます。

+1

後で試してもキャッチがたくさん...私はObjectOutputStreamだけを単独で使うことに決めました。迅速な返信をありがとう。 –

+0

2つのストリームを使用できない理由を説明できますか?それはバッファリングに起因するのでしょうか? – Kevin

0

ObjectOutputStreamは、そのチャネルのObjectOutputStreamとしてのみ使用してください。あなたが本当に必要な場合は別のソケットにPrintWriterを使用してください。

0

ClientHandlerを拡張し、ファイル転送を処理するコードを組み込むようにコンストラクタを上書きします。 2つのポートを開き、1つはテキスト用、もう1つはファイル転送用です。あなたはすべての後に()checkErrorを呼び出すために用意されていない限り

private static PrintWriter output; 

public ClientHandler(Socket socket) throws IOException 
{ 
    client = socket; 
    input = new Scanner(client.getInputStream()); 
    output = new PrintWriter(client.getOutputStream(), true); 
} 

private static ObjectOutputStream outStream; 

public ClientFileHandler(Socket socket) extends ClientHandler throws IOException 
{ 
    client = socket; 
    outStream = new ObjectOutputStream(client.getOutputStream()); 

}