2016-04-18 4 views
0

Javaのサーバー/クライアントプロジェクトでは、プログラムの実行中のいつでもクライアントが詳細を要求できます一意のIDに関連し、サーバーは関連する一連の詳細を返します。これはsocket.getOutputStreamにアクセスするオブジェクトPrintWriterによって行われ、正常に動作します。Java - ObjectOutputStreamを介したImageIconの送信は初めてですが、それ以降ではありません

私はまた、サーバーからクライアントへのイメージの送受信を含めようとしており、プログラムからいくつかの非常に奇妙な動作に出会ったことがあります。送信および画像を受信

方法を以下に示す:

サーバ側:

//send image associated with item 
//through ObjectOutputStream to client 
private void sendItemImage(BidItem item) 
{ 
    try 
    { 
     //wrap object output stream around 
     //output stream to client at this socket 
     ObjectOutputStream imageOutput = 
       new ObjectOutputStream(client.getOutputStream()); 
     //send image object to client 
     imageOutput.writeObject(item.getItemImage()); 
    } 
    catch (IOException ioEx) 
    { 
     //alert server console 
     System.out.println("\nUnable to send image for item " 
         + item.getItemCode() + " to " 
         + bidderName + "!"); 
     //no exit from system 
     //bidding can still continue 
    } 
} 

クライアント側:

//to be displayed on GUI 
private static void receiveItemImage() 
{ 
    try 
    { 
     //wrap ObjectInputStream around socket 
     //to receive objects sent from server 
     ObjectInputStream imageInput = 
       new ObjectInputStream(socket.getInputStream()); 
     //read in image and store in ImageIcon instance 
     image = (ImageIcon) imageInput.readObject(); 

     //re-create label object to be blank 
     imageLabel = new JLabel(); 
     //remove label containing last image 
     imagePanel.remove(imageLabel); 
     //just ignores command if it does not already contain image 

     //apply image to label 
     imageLabel.setIcon(image); 
     //apply image to CENTER of panel 
     imagePanel.add(imageLabel, BorderLayout.CENTER); 
    } 
    //problem in input stream 
    catch (IOException ioEx) 
    { 
     //alert user 
     JOptionPane.showMessageDialog(
       null, "Error receiving image!"); 
     //allow system to continue 
     //no exit 
    } 
    //problem casting to ImageIcon type 
    catch (ClassNotFoundException cnfEx) 
    { 
     //alert user 
     JOptionPane.showMessageDialog(
       null, "Error converting Object to ImageIcon!"); 
     //allow system to continue 
     //no exit 
    } 
} 

したがって、各時間要求がありますsocket.getOutputStream/socket.getInputStreamを使用して、画像の通過を処理するためにObjectOutpuStreamObjectInputStreamが作成されます。

これらのメソッドは、クライアントがサーバーに接続するときに最初に呼び出され、最初のイメージと一連の詳細が自動的に送信されます。これはうまくいきますが、プログラム全体で画像を要求するとその後の試みではcatch (IOException)句が満たされ、上記のエラーメッセージが表示されます。

私の人生のために私はなぜこれが初めてではなく、これ以後にはうまくいかないのか分かりません。誰かが正しい方向に私を指すことができれば、それは素晴らしいだろう!

おかげで、 マーク

+0

'JOptionPane.showMessageDialog()'の直前にスタックトレースを追加できます: 'ioEx.printStackTrace (); '? – Saheed

答えて

1

あなたは一度だけのストリームをラップする必要があります。この場合、オブジェクトストリームに対しては機能しないため、再度ラップすることはできません。

ストリームを1回だけラップしたら、画像を送信した後にObjectOutputStream.reset()に電話してください。これをしないと、オブジェクトへの参照をもう一度渡すだけです(メモリを大量に使用します)

+0

'ObjectOutputStream'インスタンスが作成され、各関数呼び出しで破棄されても、これは変わりませんか?それを一度割り当てるだけであれば、それが世界的に宣言されるのは意味がありますか? – marcuthh

+0

ソケットを保存する場所には、ObjectInputStreamとObjectOutptuStreamも格納されます。どのようにしても、ストリームを一度しかラップする必要はありません。 –

+0

これを指摘してくれてありがとう、ありがとう! – marcuthh

関連する問題