Thanks for your replays.

Kostya, I did as you suggested and I'm now looking for the delimiter
('\0') on the of the last read buffer and not just the last byte.
I didn't understand how can I check the return value in the write()
method since it is declared as void. is there another way?

Mark, I'll check the broadcast Intents. can you refer me to an
example?

Thanks
ayanir

On May 29, 5:47 pm, Kostya Vasilyev <[email protected]> wrote:
> Ayanir,
>
> Your code seems to make assumptions about network data exchange that
> don't necessarily hold true for GSM connection, such as:
>
> - write() always sending the entire data buffer, this may not be the
> case. It's necessary to check the return value to see how much was
> actually sent.
> - read() receiving data broken down by the same chunks as were sent. The
> check for '\0' needs to be changed to look for it anywhere in the
> buffer, breaking it down into application-specific packets.
>
> -- Kostya
>
> 29.05.2010 17:24, ayanir пишет:
>
>
>
> > anyone?
>
> > On May 27, 5:31 pm, ayanir<[email protected]>  wrote:
>
> >> Hello,
>
> >> I’m working on application that uses a socket connection.
> >> I’ve implemented 2 different Threads for the read() and the write()
> >> methods so they are not being blocked by the read.
> >> Everything is working well on the WiFi connection but when I switch to
> >> GSM connection the connection becomes unstable without any exception
> >> being thrown. It means that there are freezes – the write and read
> >> seems to work but no data is actually being piped.
> >> Here is what I’m doing:
>
> >> private Socket socketConn = null;
> >> private DataInputStream dis = null;
> >> private DataOutputStream dos = null;
>
> >> //Read buffer
> >> private byte[] buffer;
> >> ByteArrayOutputStream readBuffer;
>
> >> private String serverAddress;
> >> private int serverPort;
>
> >> public void openConnection(int timeout) throws Exception {
> >>          if(socketConn != null){
> >>                  return;
> >>          }
>
> >>          //if we need to resolve the host - if succeed we replace the 
> >> default
> >> otherwise we use the default.
> >>          //the check is done only once.
> >>          if(checkHostResolved){
> >>                  checkHostResolved = false;
> >>                  try{
> >>                          InetAddress ia = 
> >> InetAddress.getByName(serverHostAddress);
> >>                          serverAddress = ia.getHostAddress();
> >>                  }
> >>                  catch(UnknownHostException e2){
> >>                          MyLog.printException(this, e2, 
> >> "run()InetAddress.getByName");
> >>                  }
> >>          }
> >>          socketConn = new Socket();
> >>          InetSocketAddress isa = new InetSocketAddress(serverAddress,
> >> serverPort);
> >>          socketConn.connect(isa, timeout);
> >>          socketConn.setKeepAlive(true);
> >>          socketConn.setTcpNoDelay(true);
> >>          socketConn.setSoLinger(true, 1000);
>
> >>          dis = new DataInputStream(socketConn.getInputStream());
> >>          dos = new DataOutputStream(socketConn.getOutputStream());
>
> >> }
>
> >> public void closeConnection() {
> >>          if(socketConn != null){
> >>                  try{
> >>                          if(dis != null){
> >>                                  socketConn.shutdownInput();
> >>                                  dis.close();
> >>                          }
> >>                          if(dos != null){
> >>                                  socketConn.shutdownOutput();
> >>                                  dos.close();
> >>                          }
> >>                          if(socketConn != null){
> >>                                  socketConn.close();
> >>                          }
> >>                          if(readBuffer != null){
> >>                                  readBuffer.reset();
> >>                          }
> >>                  }
> >>                  catch(IOException ioe){
> >>                          MyLog.printException(this, ioe, "Problem Closing 
> >> connection");
> >>                  }
> >>                  finally{
> >>                          dis = null;
> >>                          dos = null;
> >>                          socketConn = null;
> >>                  }
> >>          }
> >>          MyLog.printLog(this, "closeConnection end");
>
> >> }
>
> >> private int trySend(String message) {
>
> >>          try{
> >>                  byte[] data = message.getBytes();
> >>                  dos.write(data);
> >>                  dos.flush();
> >>                  return 0;
> >>          }
> >>          catch(SocketException se){
> >>                  MyLog.printException(this, se, "Problem with trySend");
> >>          }
> >>          catch(Exception e){
> >>                  MyLog.printException(this, e, "trySend()");
> >>          }
>
> >>          MyLog.printLog(this, "trySend() Problem with trySend!!!!");
> >>          return ERROR_CODE_CONNECTION;
>
> >> }
>
> >> private boolean tryRead() {
> >>          try{
> >>                  int b = 0;
> >>                  while((b = dis.read(buffer))>  0){
> >>                          readBuffer.write(buffer, 0, b);
>
> >>                          //if the last read byte is '\0' then we have 
> >> complete reading at
> >> least 1 packet of data
> >>                          if(buffer[b - 1] == '\0'){
> >>                                  byte[] data = readBuffer.toByteArray();
> >>                                  MyLog.printLog(this, "read data.length=" 
> >> + data.length);
> >>                                  readBuffer.reset();
> >>                                  String text = new String(data, "utf-8");
> >>                                  return true;
> >>                          }
> >>                          MyLog.printLog(this, "out while read b=" + b);
> >>                          //if the b<0 then EOF has reached
> >>                          if(b<  0){
> >>                                  throw new Exception("EOF has reached");
> >>                          }
> >>                  }
> >>          }
> >>          catch(Exception e){
> >>          }
> >>          return false;
>
> >> }
>
> >> Does anyone encounter connection stability problems?
> >> Do I need to open the connection differently?
> >> How about using SocketChannel is it more reliable?
> >> Does Socket connection is a good approach when talking about mobile
> >> network connection?
>
> >> Thanks
> >> ayanir
>
> --
> Kostya Vasilev -- WiFi Manager + pretty widget --http://kmansoft.wordpress.com

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to