Tôi hiện đang viết một ứng dụng trên Blackberry để gửi và nhận một số dữ liệu thô tới một thiết bị dựa trên TCP khác trên mạng của tôi. Tôi đang gặp vấn đề tương tự trong giả lập Blackberry w/một mô phỏng MDS chạy và sử dụng một điện thoại vật lý nói chuyện với máy chủ MDS của công ty tôi. Lưu ý vấn đề này không xảy ra khi sử dụng wifi trực tiếp và không qua MDS.Sự cố khi sử dụng SocketConnection với Blackberry bằng MDS
Vấn đề là hàm available() trên InputStream trả về số không trừ khi tôi gọi hàm read() trước tiên. Nếu tôi gọi đọc đầu tiên (biết có một số dữ liệu có sẵn .. cảm ơn bạn wireshark) dữ liệu trở lại, và các cuộc gọi tiếp theo để có sẵn() chỉ ra những dữ liệu còn lại mà tôi đã không đọc. Vấn đề là tôi không phải lúc nào cũng được đảm bảo rằng dữ liệu sẽ ở đó và vì vậy tôi có thể chặn. Có ai nhận thức được điều này, và đây có phải là một vấn đề hay cái gì đó là do thiết kế?
Có ai biết cách kiểm tra nếu (các) phương thức read() sẽ chặn trước khi gọi chúng sang một bên không?
Đây là cơ bản những gì tôi đang làm:
SocketConnection s = (SocketConnection)Connector.open("socket://1.2.3.4:port;deviceside=false", Connector.READ_WRITE); OutputStream o = ((StreamConnection)s).openOutputStream(); InputStream i = ((StreamConnection)s).openInputStream(); o.write("hello"); Thread.sleep(sometime); if (i.available() > 0) { byte[] data = new data[10]; int bytesRead = i.read(data); System.out.println("Read [" + new String(data) + "] (bytes = " + bytesRead + ")"); }
tôi phải nhận xét ra nếu có điều kiện để làm việc này.
Nó có thể chặn - nhưng đó có phải là vấn đề nếu mạng của bạn nằm trên một chuỗi riêng biệt không? – lilbyrdie
Tôi nghĩ rằng tôi đã đọc ở đâu đó trong các tài liệu mà hành vi được chỉ định này có sẵn. Như libyrdie nói chủ đề là bạn của bạn. Tôi quay lên một sợi chỉ để đọc và chỉ để nó chặn. – Richard
Bình thường thì không sao.Vấn đề là chúng tôi đang cố gắng tìm hiểu xem một thiết bị có mặt hay hoạt động chính xác hay không bằng cách xem liệu nó có phản ứng với một ping TCP cụ thể hay không. Chỉ cho phép đọc để chặn không giúp đỡ nhiều. Về cơ bản chúng tôi phải sinh ra sợi chỉ và sau đó giết nó sau X giây. Đây không phải là quá khó, nhưng không lý tưởng. Điều này sẽ không gây phiền toái nếu điều này không hoạt động khi sử dụng Wifi trực tiếp thay vì kết nối MDS. Nếu bạn sử dụng Wi-Fi trực tiếp, công trình sẽ tuyệt vời. – borq