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