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

-- 
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