SocketException - 'Socket is closed' mesmo quando isConnected () retorna true
Estou fazendo e app android que usa comunicação de soquete para enviar uma imagem para um aplicativo java em execução em um computador
Aqui está o que está acontecendo: A área de trabalho está executando um aplicativo java de servidor, o aplicativo android cliente é executado no dispositivo, transfere uma imagem para o servidor e essa parte vai bem. Depois disso, o aplicativo do servidor recebe uma linha do console e a envia de volta ao aplicativo do Android. Até que a mensagem é recebida pelo aplicativo android, é suposto para mostrar uma caixa de diálogo de progresso e fica preso lá. O aplicativo android é suposto para ler a seqüência passada pelo aplicativo de desktop usando readLine (), mas quando eu tento abrir o fluxo de entrada sobre o soquete no aplicativo android dá-me a exceção.
A seguir estão os códigos, primeiro para o servidor de desktop, depois para o cliente android
import java.net.ServerSocket; import java.net.Socket; import java.io. *;
<code>class ProjectServer { ServerSocket serSock; Socket sock; BufferedReader in; PrintWriter out; public static void main(String ar[]) { try { ProjectServer cs=new ProjectServer(); cs.startServer(); } catch(Exception e) { } } public void startServer() { try { serSock=new ServerSocket(8070); System.out.println("Waiting for client..."); sock=serSock.accept(); System.out.println("Connections done"); //Accept File System.out.println("Connected"); System.out.println(sock.isConnected()+"1"); //receive code int filesize=450660; int bytesRead; int current=0; // receive file byte [] mybytearray = new byte [filesize]; InputStream is = sock.getInputStream(); FileOutputStream fos = new FileOutputStream("C:\\Project Server\\Capture.png"); BufferedOutputStream bos = new BufferedOutputStream(fos); bytesRead = is.read(mybytearray,0,mybytearray.length); current = bytesRead; do { bytesRead = is.read(mybytearray, current, (mybytearray.length-current)); if(bytesRead >= 0) current += bytesRead; } while(bytesRead > -1); bos.write(mybytearray, 0 , current); bos.flush(); System.out.println("end-start"); bos.close(); //sock.close(); //receive code ends //System.out.println(br.readLine()); //Matlab computation //Send result System.out.println(sock.isConnected()+"2"); PrintWriter pr=new PrintWriter(sock.getOutputStream(),true); pr.println((new BufferedReader(new InputStreamReader(System.in))).readLine()); System.out.println(sock.isConnected()+"3"); (new BufferedReader(new InputStreamReader(System.in))).readLine(); System.out.println(sock.isConnected()+"4"); } catch(Exception e) { System.out.println(e); e.printStackTrace(); } } } </code>
Cliente Android:
<code>package com.site.custom; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class Act2 extends Activity { private ProgressDialog pd; private String serverIP="58.146.100.187"; private BufferedReader in; private PrintWriter out; private String path; private Socket cliSock; public void onCreate(Bundle onCreateInstance) { super.onCreate(onCreateInstance); setContentView(R.layout.act2); this.setTitle("This has started"); path=getIntent().getStringExtra("path"); //Establish Connection //pd=ProgressDialog.show(this, "Establishing connection", "Finding server",false,true); try { cliSock=new Socket(serverIP,8070); //pd.dismiss(); //Log.v("MERA MSG","changing text"); ((TextView)findViewById(R.id.tview)).setText(path); } catch(Exception e) { Log.v("MERA MSG",e.toString()); } //Send file //Log.v("MERA MSG","changing text1"); ProgressDialog pd=ProgressDialog.show(this, "Sending image", "Image chosen:"+path.substring(path.lastIndexOf("//")+1),false,true); //Log.v("MERA MSG","changing text2"); try { File myFile = new File (path); System.out.println((int)myFile.length()); byte[] mybytearray = new byte[450560]; FileInputStream fis = new FileInputStream(myFile); BufferedInputStream bis = new BufferedInputStream(fis); bis.read(mybytearray,0,mybytearray.length); OutputStream os = cliSock.getOutputStream(); System.out.println("Sending..."); os.write(mybytearray,0,mybytearray.length); os.flush(); os.close(); bis.close(); //sock.close(); //System.out.println("Completed"); System.out.println(cliSock.isConnected()+"1"); pd.dismiss(); //System.out.println("Done"); System.out.println(cliSock.isConnected()+"2"); //Show dialog box till computation results arrive pd=ProgressDialog.show(this, "Recognizing...", "(waiting for server reply)",false,true); System.out.println(cliSock.isConnected()+"3"); in=new BufferedReader(new InputStreamReader(cliSock.getInputStream())); System.out.println(in.readLine()); pd.dismiss(); } catch(Exception e) { Log.v("MERA MSG",e.toString()); e.printStackTrace(); } } } </code>
E aqui estão os logs do LogCat:http://pastebin.com/atHMycTa Você pode confirmar que o soquete ainda está conectado aqui, como mostra a verdade nas linhas 350 e 349. Veja a linha 351 para o erro.