2016-12-09 11 views
0

私はJavaでネットワーキングプログラムを作っています。タイトルは、サーバーが送信しようとしているオブジェクトが受信したクライアントで変更されます。私はサーバーから新しいものを受け取る前にクライアントに存在するオブジェクトを変更しようとしています。 ここに私のコードです。最初はServer.sendIdeaで、2番目はClient.rcvIdeaです。オブジェクトをwriteObjectメソッドで送信したときにオブジェクトが変更されないのはなぜですか?

void sendIdea(Idea _idea) throws IOException { 
    objectOS.flush(); 
    Idea idea = _idea; 
//when I look into 'idea' it's fine 
    objectOS.writeObject(idea); 
} 

..

Idea rcvIdea(int _ideaCode) throws ClassNotFoundException, IOException { 
    objectOS.writeObject("sendIdea"); 
    objectOS.writeObject(_ideaCode); 
    Idea returnValue = (Idea) objectIS.readObject(); 
//when I look into 'returnValue', it is not the one 'sendIdea' has sent. 
    return returnValue; 
} 

あなたが見ることができるように、sendIdea(Idea _idea)writeObjectメソッドを使用して、クラスIdeaからオブジェクトを送信しています。 rcvIdea()readObject()メソッドを使用してオブジェクトを受信して​​います。 (私はあなたがクラスIdeaについて詳細に知る必要はないと確信しています)。クライアントは実際にこの方法でこのプログラムの開始時に何かIdeaを受信しましたが、問題はありませんでした。しかし、sendIdeaメソッドで送信しようとしているオブジェクトが正しく変更されているServerクラスのように、同じであるがわずかに変更されたオブジェクトIdeaをこのメソッドで受信しようとすると、Clientクラスでオブジェクトは変更されません。私はこの問題を解決するために約5時間を試しました。すべてのコードを1行ずつチェックしたところ、何も見つかりませんでした。私はかなりwriteObjectまたはreadObjectメソッドに問題があると確信しています。私はobjectOS.flush()を試してストリームと他の多くの試練をはっきりさせました。私は問題を見つけることができることを願っています。以下は私のプログラムのいくつかのコードです

Client.class package ideaOcean;

import java.awt.HeadlessException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.OutputStream; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.ArrayList; 

import javax.swing.JOptionPane; 

import data.Idea; 
import data.Opinion; 
import data.Profile; 

public class Client { 
Socket socket; 
OutputStream os; 
ObjectOutputStream objectOS; 
InputStream is; 
ObjectInputStream objectIS; 
MainWindow mainWindow; 

int idCode; 
String email, password; 
Profile myProfile; 
ArrayList<Idea> myIdeas; 
ArrayList<Opinion> myOpinions; 
ArrayList<Integer> newIdeasCodes, hotIdeasCodes; 
ArrayList<Idea> newIdeas, hotIdeas; 

String command; 

static final String SERVER_IP = "127.0.0.1";// 
static final int SERVER_PORT_NUM = 5000; 

public static void main(String[] args) { 
    Client client = new Client(); 
    client.mainWindow = new MainWindow(); 

    client.mainWindow.setVisible(true); 

    client.mainWindow.showLoginPg(); 
    try { 
     while (!client.loginCheck()) {// login 
      continue; 
     } 
    } catch (HeadlessException | NumberFormatException | ClassNotFoundException | IOException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("[login complete]"); 

    try { 
     client.myProfile = client.rcvProfile(client.idCode);// get myProfile 
     int i; 
     for (i = 0; i < client.myProfile.myIdeaCode.size(); i++) { 
      client.myIdeas.add(client.rcvIdea(client.myProfile.myIdeaCode.get(i))); 
     } 
     for (i = 0; i < client.myProfile.myOpinionCode.size(); i++) { 
      client.myOpinions.add(client.rcvOpinion(client.myProfile.myOpinionCode.get(i))); 
     } 
     // *************************** 
    } catch (ClassNotFoundException | IOException e1) { 
     e1.printStackTrace(); 
    } 

    try { 
     client.rcvNewIdeas(12); 
     client.mainWindow.newOcean.floatingIdeas = client.newIdeas; 
     client.mainWindow.newOcean.arrangeFloatingPanels(); 

     client.rcvHotIdeas(12); 
     client.mainWindow.hotOcean.floatingIdeas = client.hotIdeas; 
     client.mainWindow.hotOcean.arrangeFloatingPanels(); 
    } catch (ClassNotFoundException | IOException e) { 
     e.printStackTrace(); 
    } 

    client.mainWindow.setMyPg(client.myProfile, client.myIdeas, client.myOpinions); 
    client.mainWindow.showMainPg(); 

    client.start(); 
} 

public Client() { 
    try { 
     socket = new Socket(SERVER_IP, SERVER_PORT_NUM); 

     System.out.println("Connected to Server!"); 

     os = socket.getOutputStream(); 
     objectOS = new ObjectOutputStream(os); 
     is = socket.getInputStream(); 
     objectIS = new ObjectInputStream(is); 

     myIdeas = new ArrayList<>(); 
     myOpinions = new ArrayList<>(); 
     newIdeasCodes = new ArrayList<>(); 
     hotIdeasCodes = new ArrayList<>(); 
     newIdeas = new ArrayList<>(); 
     hotIdeas = new ArrayList<>(); 

    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

void start() { 
    while (true) { 
     try { 
      if (mainWindow.newBtnClicked) { 
       rcvNewIdeas(12); 
       mainWindow.newOcean.floatingIdeas = newIdeas; 
       mainWindow.newOcean.arrangeFloatingPanels(); 
       mainWindow.newBtnClicked = false; 
      } else if (mainWindow.hotBtnClicked) { 
       rcvHotIdeas(12); 
       mainWindow.hotOcean.floatingIdeas = hotIdeas; 
       mainWindow.hotOcean.arrangeFloatingPanels(); 
       mainWindow.hotBtnClicked = false; 
      } else if (mainWindow.newOcean.detailBtnClicked) { 

       updateIdeaDetailFrame(mainWindow.newOcean.clickedIdea); 
       mainWindow.newOcean.detailBtnClicked = false; 

      } else if (mainWindow.hotOcean.detailBtnClicked) { 

       updateIdeaDetailFrame(mainWindow.hotOcean.clickedIdea); 
       mainWindow.hotOcean.detailBtnClicked = false; 

      } else if (mainWindow.ideaDetailFrame.saveOpinionBtnClicked) { 

       sendOpinion(mainWindow.ideaDetailFrame.newOpinion); 
       updateIdeaDetailMainPanel(rcvIdea(mainWindow.ideaDetailFrame.idea.ideaCode)); 
       mainWindow.ideaDetailFrame.saveOpinionBtnClicked = false; 

      } else if (mainWindow.writeIdeaPg.postIdeaBtnClicked) { 

       sendIdea(mainWindow.writeIdeaPg.thisIdea); 
       mainWindow.writeIdeaPg.postIdeaBtnClicked = false; 

      } else if (mainWindow.newOcean.plusBtnClicked) { 

       objectOS.writeObject("plusBtnClicked"); 
       objectOS.writeObject(mainWindow.newOcean.plusMinusClickedIdeaCode); 
       mainWindow.newOcean.plusBtnClicked = false; 

      } else if (mainWindow.newOcean.minusBtnClicked) { 

       objectOS.writeObject("minusBtnClicked"); 
       objectOS.writeObject(mainWindow.newOcean.plusMinusClickedIdeaCode); 
       mainWindow.newOcean.minusBtnClicked = false; 

      } else if (mainWindow.hotOcean.plusBtnClicked) { 

       objectOS.writeObject("plusBtnClicked"); 
       objectOS.writeObject(mainWindow.hotOcean.plusMinusClickedIdeaCode); 
       mainWindow.hotOcean.plusBtnClicked = false; 

      } else if (mainWindow.hotOcean.minusBtnClicked) { 

       objectOS.writeObject("minusBtnClicked"); 
       objectOS.writeObject(mainWindow.hotOcean.plusMinusClickedIdeaCode); 
       mainWindow.hotOcean.minusBtnClicked = false; 

      } else if (mainWindow.myBtnClicked) { 

       mainWindow.setMyPg(myProfile, myIdeas, myOpinions); 
       mainWindow.myBtnClicked = false; 
      } 
     } catch (ClassNotFoundException | IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

int i = 0; 

Idea rcvIdea(int _ideaCode) throws ClassNotFoundException, IOException { 
    objectOS.writeObject("sendIdea"); 
    objectOS.writeObject(_ideaCode); 
    Idea returnValue = (Idea) objectIS.readObject(); 
    return returnValue; 
} 

Opinion rcvOpinion(int _opinionCode) throws ClassNotFoundException, IOException { 
    objectOS.writeObject("sendOpinion"); 
    objectOS.writeObject(_opinionCode); 
    return (Opinion) objectIS.readObject(); 
} 

Profile rcvProfile(int _idCode) throws IOException, ClassNotFoundException { 
    objectOS.writeObject("sendProfile"); 
    objectOS.writeObject(_idCode); 
    return (Profile) objectIS.readObject(); 
} 

void rcvNewIdeasCodes() throws ClassNotFoundException, IOException { 
    objectOS.writeObject("sendNewIdeasCodes"); 
    newIdeasCodes = (ArrayList<Integer>) objectIS.readObject(); 
} 

void rcvHotIdeasCodes() throws IOException, ClassNotFoundException { 
    objectOS.writeObject("sendHotIdeasCodes"); 
    hotIdeasCodes = (ArrayList<Integer>) objectIS.readObject(); 
} 

void rcvNewIdeas(int num) throws ClassNotFoundException, IOException { 
    int i; 
    rcvNewIdeasCodes(); 
    newIdeas = new ArrayList<>(); 
    if (num <= newIdeasCodes.size()) { 
     for (i = 0; i < num; i++) { 
      newIdeas.add(rcvIdea(newIdeasCodes.get(i))); 
     } 
    } else { 
     for (i = 0; i < newIdeasCodes.size(); i++) { 
      newIdeas.add(rcvIdea(newIdeasCodes.get(i))); 
     } 
    } 
} 

void rcvHotIdeas(int num) throws ClassNotFoundException, IOException { 
    int i; 
    rcvHotIdeasCodes(); 
    hotIdeas = new ArrayList<>(); 
    if (num <= hotIdeasCodes.size()) { 
     for (i = 0; i < num; i++) { 
      hotIdeas.add(rcvIdea(hotIdeasCodes.get(i))); 
     } 
    } else { 
     for (i = 0; i < hotIdeasCodes.size(); i++) { 
      hotIdeas.add(rcvIdea(hotIdeasCodes.get(i))); 
     } 
    } 
} 

void sendIdea(Idea _idea) throws IOException { 
    objectOS.writeObject("rcvIdea"); 
    objectOS.writeObject(_idea); 
} 

void sendOpinion(Opinion _opinion) throws IOException { 
    objectOS.writeObject("rcvOpinion"); 
    objectOS.writeObject(_opinion); 
} 

void sendProfile(Profile _profile) throws IOException { 
    objectOS.writeObject(_profile); 
} 

boolean loginCheck() throws HeadlessException, NumberFormatException, IOException, ClassNotFoundException { 
    objectOS.writeObject("loginCheck");// send command 

    while (!mainWindow.loginBtnClicked) { 
     continue; 
    } 
    mainWindow.loginBtnClicked = false; 

    email = mainWindow.emailField.getText().trim(); 
    password = mainWindow.passwordField.getText().trim(); 
    objectOS.writeObject(email); 
    objectOS.writeObject(password); 

    boolean valid; 
    valid = (boolean) objectIS.readObject(); 
    if (valid == false) { 
     JOptionPane.showMessageDialog(mainWindow, "ID or Password is not correct"); 
     mainWindow.emailField.setText(""); 
     mainWindow.passwordField.setText(""); 
     return false; 
    } else if (valid == true) { 
     idCode = (int) objectIS.readObject(); 
     return true; 
    } else { 
     return false; 
    } 
} 

void updateIdeaDetailMainPanel(Idea clickedIdea) throws ClassNotFoundException, IOException { 
    ArrayList<Opinion> opinions = new ArrayList<>(); 
    for (int j = 0; j < clickedIdea.opinionCode.size(); j++) { 
     opinions.add(rcvOpinion(clickedIdea.opinionCode.get(j))); 
    } 
    mainWindow.ideaDetailFrame.updateMainPanel(opinions); 
} 

void updateIdeaDetailFrame(Idea clickedIdea) throws ClassNotFoundException, IOException { 
    ArrayList<Opinion> opinions = new ArrayList<>(); 
    for (int j = 0; j < clickedIdea.opinionCode.size(); j++) { 
     opinions.add(rcvOpinion(clickedIdea.opinionCode.get(j))); 
    } 
    mainWindow.ideaDetailFrame = new IdeaDetailFrame(clickedIdea, opinions); 
    mainWindow.ideaDetailFrame.setVisible(true); 
} 
} 

アイデアクラス パッケージデータ。

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.Date; 

public class Idea implements Serializable { 

private static final long serialVersionUID = 123123L; 
public int idCode; 
public int ideaCode; 

public int plus = 0, minus = 0; 

public String ideaName; 
public String oneLineExp; 
public String explanation; 
public ArrayList<Integer> opinionCode; 
public Date date; 
public MyCanvas image; 

int hotDegree; 

public Idea(int _idCode,int _ideaCode, String _ideaName, String _oneLineExp, String _explanation, MyCanvas _image) { 
    this(_idCode,_ideaName,_oneLineExp,_explanation,_image); 
    ideaCode = _ideaCode; 

} 

public Idea(int _idCode, String _ideaName, String _oneLineExp, String _explanation, MyCanvas _image) { 
    this(_idCode,_ideaName,_oneLineExp,_explanation); 
    image = _image; 
} 

public Idea(int _idCode, String _ideaName, String _oneLineExp, String _explanation){ 
    idCode = _idCode; 
    oneLineExp = new String(_oneLineExp); 
    ideaName = new String(_ideaName); 
    explanation = new String(_explanation); 
    date = new Date(); 
    opinionCode = new ArrayList<>(); 
} 

public void saveIdea() { 
    FileOutputStream fos = null; 
    ObjectOutputStream oos = null; 

    try { 
     fos = new FileOutputStream("Idea.dat"); 
     oos = new ObjectOutputStream(fos); 

     oos.writeObject(this); 
    } catch (IOException e1) { 
     System.out.println("e1"); 
    } 
} 

void addOpinionCode(int _opinion) { 
    opinionCode.add(opinionCode.size(), _opinion); 
} 

public void incPlus() { 
    plus++; 
} 

public void incMinus() { 
    minus++; 
} 

public int setHotDegree() { 
    hotDegree = plus - minus + opinionCode.size() * 2; 
    return hotDegree; 
} 

}

Opinion.class

+1

(私はあなたが詳細にクラスのアイデアを知っている必要はないと確信しています) - >実際にはい、私たちは行う – JonK

+0

私はそれを取る 'objectOS'と' objectIS'は標準ObjectInput/OutputStreamsですか?そうであれば、読み書き方法が正しく動作しない可能性は非常に低いです。これは、あらゆる種類の生産品質コードで巨大なコードベースによって使用されています。 Ideaクラスの実装の詳細により、ObjectInputStream.readObject()のオブジェクトインスタンス化が直感的ではなくなります(たとえば、静的変数がコンストラクタで使用されるか、または状態がシリアライズされたオブジェクトから切り離されるため)。 –

+1

「物体は変わらない」とはどういう意味ですか?属性は変更されませんか? 'equals'はまだtrueを返しますか?あなたは '同じだが少し変更されたオブジェクトのアイデア'を書いた、あなたはMVCEをポビドして、オブジェクトをどのように変更して送信するのかを示すことができますか? – jhamon

答えて

0
package data; 

import java.io.Serializable; 
import java.util.Date; 

public class Opinion implements Serializable{ 
int idCode; 
public int opinionCode;//the intrinsic code of this opinion 

public int commentedIdeaCode; 
public String opinion; 
public Date date; 
int plus, minus; 

public Opinion(int _idCode,int _commentedIdeaCode, String _opinion){ 
    idCode = _idCode; 
    commentedIdeaCode = _commentedIdeaCode; 
    opinion = new String(_opinion); 
    date = new Date(); 
    plus = 0; 
    minus = 0; 
}// Opinion(int _idCode,int _commentedIdeaCode, String _opinion) 

public Opinion(int _idCode,int _opinionCode,int _commentedIdeaCode, String _opinion){ 
    this(_idCode, _commentedIdeaCode, _opinion); 
    opinionCode = _opinionCode; 
}//Opinion(int _idCode,int _opinionCode,int _commentedIdeaCode, String _opinion) 

void incPlus(){ 
    plus++; 
} 

void incMinus(){ 
    minus++; 
} 
} 

ObjectOutputStreamが既にシリアル化されているすべてのオブジェクトのグラフを作成し、以前にシリアル化されたオブジェクトへの参照を使用します。したがって、Ideaインスタンスを複数回シリアル化すると、最初のインスタンス以降のたびに、完全なオブジェクトではなく最初のシリアル化への参照が書き込まれます。

各シリアル化の後にObjectOutputStream.reset()を使用できます。これにより、オブジェクトグラフが破棄され、以前に見たオブジェクトの場合でも、ObjectOutputStreamに新しいオブジェクトのシリアル化が強制的に作成されます。

あなたsendIdea方法は、したがって、次のようになります。

void sendIdea(Idea _idea) throws IOException { 
    objectOS.flush(); 
    objectOS.reset(); 

    Idea idea = _idea; 
    objectOS.writeObject(idea); 
} 

非常に重要なのは、リセット後の()ことに注意してください、すべてのオブジェクト参照が新たにシリアライズされます。したがって、複雑なオブジェクトグラフを作成すると、デシリアライズ後にオブジェクトの重複が発生する可能性があります。

複数回シリアル化されるオブジェクトの推移的な参照を共有する場合は、代わりにObjectOutputStream.writeUnshared()を参照してください。

関連する問題