Actualmente estoy escribiendo una aplicación en Blackberry para enviar y recibir datos en bruto a otro dispositivo TCP en mi red. Estoy teniendo el mismo problema en el simulador de Blackberry con un simulador MDS funcionando y usando un teléfono físico que habla con el servidor MDS de mi compañía. Tenga en cuenta que este problema no ocurre cuando se usa wifi directamente y no a través de MDS.Problema al usar SocketConnection con Blackberry usando MDS
El problema es que la función disponible() en InputStream devuelve cero a menos que llame primero a read(). Si llamo a leer primero (sabiendo que hay algunos datos disponibles ... gracias wireshark) los datos vuelven, y la llamada subsiguiente a disponible() indica qué datos quedan que no he leído. El problema es que no siempre se me garantizará que los datos estén allí y que pueda bloquearlos. ¿Alguien es consciente de esto? ¿Es esto un problema o algo por diseño?
¿Alguien conoce una forma de probar si el (los) método (s) de lectura (s) se bloquearán antes de llamarlos aparte de los disponibles?
Aquí es básicamente lo que estoy haciendo:
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 + ")"); }
tengo que comentar el caso condicional para que esto funcione.
Podría bloquear, pero ¿es un problema si su red está en un hilo separado? – lilbyrdie
Creo que he leído en algún lugar de los documentos que este es el comportamiento especificado que está disponible. Como dice Libyrdie, los hilos son tu amigo. Giro un hilo para hacer la lectura y simplemente dejo que se bloquee. – Richard
Normalmente eso estaría bien.El problema es que estamos tratando de averiguar si un dispositivo está presente u operando correctamente al ver si responde a un ping TCP específico. Solo permitir leer para bloquear no ayuda mucho. Básicamente tenemos que engendrar el hilo y luego matarlo después de X segundos. Esto no es muy difícil, pero no es ideal. Esto no sería tan frustrante si esto no funcionara al usar Wifi directo en lugar de una conexión MDS. Si usa WiFi directo, funciona muy bien. – borq