2012-02-21 27 views
5

Tôi đã có ứng dụng máy khách-khách hàng mà tôi đang tạo và tôi gặp một chút rắc rối khi đọc các đối tượng trên máy chủ.ObjectInputStream - Cách đợi dữ liệu mới?

Sau khi máy chủ của tôi kết nối với một ổ cắm máy khách, tôi tạo luồng đầu vào và đầu ra đối tượng và chuyển chúng theo phương thức service() của tôi. Trong đó, tôi phải xử lý các loại thông điệp khác nhau từ khách hàng. Tôi có thể nhận được một tin nhắn từ khách hàng (có nghĩa là, một đối tượng Message, thiết kế của tôi) tốt. Nhưng tất nhiên, những gì tôi muốn làm là có một vòng lặp để tôi có thể nhận được một tin nhắn, xử lý nó, và trả lời lại.

Cho đến nay, mã của tôi chỉ hoạt động đối với một thư duy nhất. Khi tôi thêm vòng lặp của mình, những gì xảy ra trên mỗi lần lặp lại, máy chủ của tôi chỉ đọc cùng một tin nhắn lặp đi lặp lại trước khi khách hàng của tôi có cơ hội gửi tin nhắn mới qua ổ cắm (tôi nghĩ đây là điều đang xảy ra, ít nhất) .

Vì vậy, những gì tôi thực sự cần làm là tìm ra cách làm cho phương thức service() của tôi chờ cho đầu vào mới. Bất kỳ ý tưởng? Hoặc tôi đang tiếp cận điều này sai? Tôi có cần phải tạo một OIS mới trên mỗi lần lặp hay không? Một số mã:

public void service(ObjectInputStream input, ObjectOutputStream output) throws IOException, Exception { 

    _shouldService = true; 

    while (_shouldService) { 
        // It just keeps reading the same message over and over 
        // I need it to wait here until the client sends a new message 
        // Unless I'm just approaching this all wrong! 
     NetworkMessage message = (NetworkMessage) input.readObject(); 

     NetworkMessageHeader header = message.getHeader(); 

     String headerType = header.getType(); 

     if (headerType.equals(NetworkMessageHeader.NetworkMessageHeaderTypeConnect)) { 
      doLoginForMessage(message, output); 
     } else if (headerType.equals(NetworkMessageHeader.NetworkMessageHeaderTypeFiles)) { 
      doFilesList(message, output); 
     } else { 
      System.out.println("Unrecognized header type: " + headerType); 

     } 
    } 
} 

Trả lời

2

Các ObjectOutputStream cache đối tượng cơ quan đại diện và sẽ không phát hiện nếu bạn đang gửi lại các ví dụ tương tự hơn và hơn nữa từ phía khách hàng, nhưng với những thay đổi trong đó. Nếu đây là kịch bản của bạn, bạn cần gọi số reset trên luồng trước mỗi lần gửi.

NetworkMessage message = new NetworkMessage(); 
for(;;) { 
    message.setProperty(whatever); 
    oos.reset(); 
    oos.writeObject(message); 
} 
+0

tôi gặp vấn đề tương tự và đặt lại không tạo ra bất kỳ sự khác biệt nào – bubakazouba

+0

@bubakazouba Vì vậy, nó không phải là vấn đề tương tự. – EJP

Các vấn đề liên quan