Witam.
Mam taki problem:
Mam kilka obiektów klasy person i chce je przesłać przez sieć (używam własnego mechanizmu serializacji, bo klient jest w midlecie a tam nie ma serializable, weygląda to tak:)
klient midlet:
public void synchronize() throws IOException, SQLException {
new Thread() {
public void run() {
try {
sock = (SocketConnection) Connector.open("socket://127.0.0.1:9999");
DataOutputStream dout = sock.openDataOutputStream();
Vector vPersons = DBManager.getInstance().getPersonsToSynchronization();
Vector vNotes = DBManager.getInstance().getNotesToSynchronization();
dout.writeInt(vPersons.size());
dout.writeInt(vNotes.size());
for (int i = 0; i < vPersons.size(); i++) {
((Person) vPersons.elementAt(i)).write(dout);
}
for (int i = 0; i < vNotes.size(); i++) {
((Note) vNotes.elementAt(i)).write(dout);
}
DataInputStream din = sock.openDataInputStream();
int personsCount = din.readInt();
int notesCount = din.readInt();
Person p = null;
for (int i = 0; i < personsCount; i++) {
p = new Person();
p.read(din);
DBManager.getInstance().savePerson(p);
}
Note n = null;
for (int i = 0; i < notesCount; i++) {
n = new Note();
n.read(din);
p = DBManager.getInstance().loadPerson(
n.getPerson_id().intValue());
DBManager.getInstance().saveNote(p, n);
}
sock.close();
}
catch (IOException e) {
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}.start();
}
od strony serwera wygląda tak:
@Override
public void run() {
try {
DataInputStream din = new DataInputStream(sock.getInputStream());
int personCount = din.readInt();
int notesCount = din.readInt();
Person p = null;
List<Person> persons = new ArrayList<Person>();
for(int i = 0 ; i < personCount; i++){
p = new Person();
p.read(din);
persons.add(p);
}
Note n = null;
List<Note> notes = new ArrayList<Note>();
for(int i = 0 ; i < notesCount; i++){
n = new Note();
n.read(din);
notes.add(n);
}
Iterator<Person> pIterator = persons.iterator();
while(pIterator.hasNext()){
DBManager.getInstance().synchronize(pIterator.next());
}
Iterator<Note> nIterator = notes.iterator();
while (nIterator.hasNext()) {
DBManager.getInstance().synchronize(nIterator.next());
}
List<Person> returnPerson = DBManager.getInstance().getPersonsToSynchronization();
List<Note> returnNote = DBManager.getInstance().getNotesToSynchronization();
DataOutputStream dout = new DataOutputStream(sock.getOutputStream());
dout.writeInt(returnPerson.size());
dout.writeInt(returnNote.size());
pIterator = returnPerson.iterator();
while(pIterator.hasNext()){
p = pIterator.next();
p.write(dout);
DBManager.getInstance().setStatus(p, Constants.SYNCHRONIZED);
}
nIterator = returnNote.iterator();
while(nIterator.hasNext()){
n = nIterator.next();
n.write(dout);
DBManager.getInstance().setStatus(n, Constants.SYNCHRONIZED);
}
// din.close();
// dout.close();
// sock.close();
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
W debugu serwer przesyła 3 obiekty do strumienia a klient odbiera tylko jednego (chyba ostatniego na liście) a analogicznie dzieje się jak ściągam klientów z komórki na serwer.
Prosze o pomoc. myślę, o wprowadzeniu Thread.sleep() w obydwu wątkach, ale może jest jakieś inne rozwiązanie?
Pozdrawiam.