Java - 错误通过ObjectOutputStream将ImageIcons从服务器发送到客户端read / writeObject()

时间:2016-02-23 15:13:28

标签: java multithreading server client imageicon

小背景,目前正试图完成我的学位任务,试图实施一个拍卖行' localhost服务器 - 客户端程序,客户端可以在其中对服务器上保存的项目出价。当新客户端连接到服务器时,用户必须注册他/她的名称,然后服务器将向客户端发送所有项目信息。

目前所有其他信息都正确发送但是当我尝试通过ObjectOutputStream将项目的图像发送到客户端时,服务器始终无法发送ImageIcons,当我断开客户端时遇到此错误消息:< / p>

StringBuffer

我认为它可能与我试图通过输出流直接发送ImageIcons而不使用serialisable但我们的java讲师告诉我们ImageIcon并不要求它正常运行所以我可以不确定,任何建议都会很棒!我将把服务器/客户端的代码放在下面!

服务器线程代码:

int

尝试向客户发送信息:

    Exception in thread "main" java.io.StreamCorruptedException: invalid type code: 53 at java.io.ObjectInputStream.readObject0(Unknown Source)
   at java.io.ObjectInputStream.readObject(Unknown Source)
   at AuctionClient.retrieveItemInformation(AuctionClient.java:365)
   at AuctionClient.main(AuctionClient.java:341)

客户端创建输入流:

public ClientHandler(Socket socket, BiddingItem item1, BiddingItem item2, int number) throws IOException
{
    client = socket;
    outputImage = new ObjectOutputStream(client.getOutputStream());
    input = new Scanner(client.getInputStream());
    output = new PrintWriter(client.getOutputStream(), true);
    startedItem1 = item1;
    startedItem2 = item2;
    clientNumber = number;
    images = new ImageIcon[2];
    images[0] = startedItem1.getImage();
    images[1] = startedItem2.getImage();
}

客户端用来接受信息的功能:

public void run()
{
    //previous code...
    for (int i=0; i<images.length;++i)
    {
        try 
        {
            outputImage.writeObject(images[i]);
        }
        catch (IOException ioEx)
        {
            System.out.println("\n**ERROR: Unable to send Item " + i + " image to client!**");
        }
        try 
        {
            outputImage.flush();
        } 
        catch (IOException e1) 
        {
            System.out.println("\n**ERROR: Unable to flush OutputObjectStream!**");
        }
    }

干杯!

中号

2 个答案:

答案 0 :(得分:1)

问题在于:

outputImage = new ObjectOutputStream(client.getOutputStream());
// ...
output = new PrintWriter(client.getOutputStream(), true);

您无法在两个不同的包装器中包装单个OutputStream。他们的个人状态和缓冲不兼容。

特别是,如果使用ObjectOutputStream之外的任何其他内容写入单个字节,则对象流已损坏。

如果要发送对象和文本,可以将String对象写入ObjectOutputStream。您也可以直接调用ObjectOutputStream.writeUTF。

答案 1 :(得分:0)

问题解决了,删除了Printwriter&amp;扫描程序流并在客户端和服务器中使用对象流替换它们,并使用.writeObject&amp; readObject方法,我还需要确保正确实现图像的路径。谢谢你的帮助!