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<ayanir...@gmail.com>  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 android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to