私はオークションを作成するための小さなクライアントサーバーアプリケーションを作成しています。それはソケット上で動作し、クライアントアプリケーションとサーバーアプリケーションはオークションオブジェクトとクライアントオブジェクトの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);
}
は
例外を教えてください。 http://stackoverflow.com/help/how-to-ask –
例外はありません。プログラムは動作します。クライアントアプリケーションの賞品を更新し、更新されたオークションをサーバーに送信し、サーバーはオークションを受け取りますが、古い賞。 – egzaell