2016-08-09 6 views
0

私はオークションを作成するための小さなクライアントサーバーアプリケーションを作成しています。それはソケット上で動作し、クライアントアプリケーションとサーバーアプリケーションはオークションオブジェクトとクライアントオブジェクトの2種類のオブジェクトを交換しています。クライアントは正常に動作しますが、オークションに問題があります。アプリが最初に特定のオークションを送ってきたら、それはうまくいきます。最初の賞は100.00と言いましょう。他のクライアントはこのオークションを受け取ります。しかし、誰かがそこに入札すると、ミラクルが発生します。私は接続をデバッグし、クライアントアプリケーションは新しい賞(110.00)でオークションを送信していますが、サーバーは古い賞(100.00)でオークションを受け取ります。何がこの問題を引き起こすかもしれませんか?クライアント側でこのオークションを送信しているソケットでオブジェクトを送受信する

public class Auction implements Comparable<Auction>, Serializable{ 

private Double prize; 
private Item item; 
private Client winner; 
private Client owner; 

public Auction(double prize, Item item, Client owner){ 
    this.prize = prize; 
    this.item = item; 
    this.owner = owner; 
    this.winner = owner; 
} 

public Auction(double prize, Item item, Client owner, Client winner){ 
    this.prize = prize; 
    this.item = item; 
    this.owner = owner; 
    this.winner = winner; 
} 

public void placeBid(double bidValue, Client winner){ 
    double newPrize = prize + bidValue; 
    setWinner(winner); 
    setPrize(newPrize); 
} 

@Override 
public int compareTo(Auction auction) { 
    int compare = prize.compareTo(auction.getPrize()); 
    return compare; 
} 

public String toString(){ 
    String value = String.format(item + " : %1$.2f | winner: " + winner, prize); 
    return value; 
} 

public double getPrize(){ 
    return prize; 
} 

public Client getWinner(){ 
    return winner; 
} 

public Client getOwner(){ 
    return owner; 
} 

public Item getItem(){ 
    return item; 
} 

public boolean equals(Object anAuction){ 
    Auction auction = (Auction) anAuction; 
    Client testOwner = auction.getOwner(); 
    Item testItem = auction.getItem(); 
    String testItemName = testItem.getName(); 
    String itemName = item.getName(); 
    double testPrize = auction.getPrize(); 
    return owner.equals(testOwner) && itemName.equals(testItemName); 
} 

private void setPrize(double prize){ 
    this.prize = prize; 
} 

private void setWinner(Client winner){ 
    this.winner = winner; 
} 
} 

方法:

private void sendAuctions() throws IOException { 
    for(Auction auction : auctionList){ 
     outputStream.writeObject("AUCTIONS"); 
     outputStream.flush(); 
     outputStream.writeObject(auction); 
     outputStream.flush(); 
    } 
} 

と、サーバー側でオークションを受け取る方法:

こちらのオークションクラスです

private void receiveData() { 
    String receivedDataLabel = ""; 
    try { 
     while (!receivedDataLabel.equals("END")) { 
      receivedDataLabel = (String) inputStream.readObject(); 
      if (receivedDataLabel.equals("CLIENTS")) { 
       receiveClients(); 
      } else if (receivedDataLabel.equals("AUCTIONS")) { 
       receiveAuctions(); 
      } else if (receivedDataLabel.equals("CONNECTION_END")){ 
       isConnected = false; 
      } 
     } 
    } catch (ClassNotFoundException | IOException e) { 
     e.printStackTrace(); 
    } 
} 

private void receiveAuctions() throws ClassNotFoundException, IOException { 
    Auction auction = (Auction) inputStream.readObject(); 
    dataContainer.registerAuction(auction); 
} 
+0

例外を教えてください。 http://stackoverflow.com/help/how-to-ask –

+0

例外はありません。プログラムは動作します。クライアントアプリケーションの賞品を更新し、更新されたオークションをサーバーに送信し、サーバーはオークションを受け取りますが、古い賞。 – egzaell

答えて

1

Javaのシリアライゼーションは、オブジェクトのグラフの整合性を保持します。すでに送信されているオブジェクトをミッティングする。 ObjectOutputStream.reset()またはObjectOutputStream.writeUnshared()を見る必要があります。

+0

これは素晴らしい作品です、ありがとうございます! – egzaell

関連する問題