Note that there are some explanatory texts on larger screens.

plurals
  1. POandroid: file transfer through sockets
    primarykey
    data
    text
    <p>hi i am trying to send a file through sockets in an android messenger. for some reason its not working. at times it does output a file but transfers no bytes that is the output file is of 0 bytes and sometimes the output or the received file is of 57 bytes precisely. following the code where i actually send the file :</p> <pre><code>public boolean sendFile(String ip, int port) { try { String[] str = ip.split("\\."); byte[] IP = new byte[str.length]; for (int i = 0; i &lt; str.length; i++) { IP[i] = (byte) Integer.parseInt(str[i]); } Socket socket = getSocket(InetAddress.getByAddress(IP), port); if (socket == null) { return false; } Log.i("SocketOP", "sendFILE-1"); File f = new File("/sdcard/chats/gas.jpg/"); filesize = (int) f.length(); BufferedOutputStream out = new BufferedOutputStream( socket.getOutputStream() ); FileInputStream fileIn = new FileInputStream(f); Log.i("SocketOP", "sendFILE-2"); byte [] buffer = new byte [filesize]; int bytesRead =0; while ((bytesRead = fileIn.read(buffer)) &gt; 0) { out.write(buffer, 0, bytesRead); } out.flush(); out.close(); fileIn.close(); Log.i("SocketOP", "sendFILE-3"); } catch (IOException e) { return false; //e.printStackTrace(); } return true; } </code></pre> <p>this is where i send the inputstream to the receivefile method :</p> <pre><code>private class ReceiveConnection extends Thread { Socket clientSocket = null; public ReceiveConnection(Socket socket) { this.clientSocket = socket; SocketOperator.this.sockets.put(socket.getInetAddress(), socket); } @Override public void run() { try { //PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader( clientSocket.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) { InputStream is=clientSocket.getInputStream(); if (inputLine.contains("Text") == true) { appManager.messageReceived(inputLine); Log.i("SocketOP","text"); } else if (inputLine.contains("Text") == false) { Log.i("SocketOP","filee"); appManager.fileReceived(is); } else { clientSocket.shutdownInput(); clientSocket.shutdownOutput(); clientSocket.close(); SocketOperator.this.sockets.remove(clientSocket.getInetAddress()); Log.i("SocketOP", "CLOSING CONNECTION"); } } } } } </code></pre> <p>and finally this is how i receive the file :</p> <pre><code>public void fileReceived(InputStream is) throws FileNotFoundException, IOException { Log.i("IMSERVICE", "FILERECCC-1"); //int filesize=6022386; // filesize temporary hardcoded int bytesRead; final byte[] aByte = new byte[is.toString().length()]; if (is!= null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); FileOutputStream fos = null; BufferedOutputStream bos = null; try { fos = new FileOutputStream("/sdcard/chats/gas1.jpg/"); bos = new BufferedOutputStream(fos); bytesRead = is.read(aByte, 0, aByte.length); do { baos.write(aByte); bytesRead = is.read(aByte); } while (bytesRead != -1); bos.write(baos.toByteArray()); bos.flush(); bos.close(); Log.i("IMSERVICE", "FILERECCC-2"); } catch (IOException ex) { // Do exception handling } } }} </code></pre> <p>the following is the complete socketoperator file :</p> <pre><code>package hardy.scl.communication; import hardy.scl.interfaces.IAppManager; import hardy.scl.interfaces.ISocketOperator; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.InetAddress; import java.net.MalformedURLException; import java.net.ServerSocket; import java.net.Socket; import java.net.URL; import java.net.UnknownHostException; import java.util.HashMap; import java.util.Iterator; import android.util.Log; public class SocketOperator implements ISocketOperator { private static final String AUTHENTICATION_SERVER_ADDRESS = "http://10.10.10.100/chippers/"; private int listeningPort = 0; private static final String HTTP_REQUEST_FAILED = null; private HashMap&lt;InetAddress, Socket&gt; sockets = new HashMap&lt;InetAddress, Socket&gt;(); private ServerSocket serverSocket = null; private boolean listening; private IAppManager appManager; public int filesize ; private class ReceiveConnection extends Thread { Socket clientSocket = null; Socket fileSocket=null; public ReceiveConnection(Socket socket) { this.clientSocket = socket; this.fileSocket=socket; SocketOperator.this.sockets.put(socket.getInetAddress(), socket); } @Override public void run() { try { // PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader( clientSocket.getInputStream())); InputStream is=fileSocket.getInputStream(); String inputLine; while ((inputLine = in.readLine()) != null) { if (inputLine.contains("Text") == true) { appManager.messageReceived(inputLine); Log.i("SocketOP","text");} else if (inputLine.contains("Text") == false) { Log.i("SocketOP","filee"); appManager.fileReceived(is); } else{ clientSocket.shutdownInput(); clientSocket.shutdownOutput(); clientSocket.close(); fileSocket.shutdownInput(); fileSocket.shutdownOutput(); fileSocket.close(); SocketOperator.this.sockets.remove(clientSocket.getInetAddress()); SocketOperator.this.sockets.remove(fileSocket.getInetAddress()); Log.i("SocketOP", "CLOSING CONNECTION"); } } } catch (IOException e) { Log.e("ReceiveConnection.run: when receiving connection ",""); } } } public SocketOperator(IAppManager appManager) { this.appManager = appManager; } public String sendHttpRequest(String params) { URL url; String result = new String(); try { url = new URL(AUTHENTICATION_SERVER_ADDRESS); HttpURLConnection connection; connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); PrintWriter out = new PrintWriter(connection.getOutputStream()); out.println(params); out.close(); BufferedReader in = new BufferedReader( new InputStreamReader( connection.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) { result = result.concat(inputLine); } in.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } if (result.length() == 0) { result = HTTP_REQUEST_FAILED; } return result; } public boolean sendMessage(String message, String ip, int port) { try { String[] str = ip.split("\\."); byte[] IP = new byte[str.length]; for (int i = 0; i &lt; str.length; i++) { IP[i] = (byte) Integer.parseInt(str[i]); } Socket socket = getSocket(InetAddress.getByAddress(IP), port); if (socket == null) { return false; } PrintWriter out = null; out = new PrintWriter(socket.getOutputStream(), true); //OutputStreamWriter outputStream = new OutputStreamWriter(socket.getOutputStream()); //outputStream.write("Text"); // outputStream.flush(); String flag = "Text"; message = message+flag; out.println(message); } catch (UnknownHostException e) { return false; //e.printStackTrace(); } catch (IOException e) { return false; //e.printStackTrace(); } return true; } public int startListening(int portNo) { listening = true; try { serverSocket = new ServerSocket(portNo); this.listeningPort = portNo; } catch (IOException e) { //e.printStackTrace(); this.listeningPort = 0; return 0; } while (listening) { try { new ReceiveConnection(serverSocket.accept()).start(); } catch (IOException e) { //e.printStackTrace(); return 2; } } try { serverSocket.close(); } catch (IOException e) { Log.e("Exception server socket", "Exception when closing server socket"); return 3; } return 1; } public void stopListening() { this.listening = false; } private Socket getSocket(InetAddress addr, int portNo) { Socket socket = null; if (sockets.containsKey(addr) == true) { socket = sockets.get(addr); // check the status of the socket if ( socket.isConnected() == false || socket.isInputShutdown() == true || socket.isOutputShutdown() == true || socket.getPort() != portNo ) { // if socket is not suitable, then create a new socket sockets.remove(addr); try { socket.shutdownInput(); socket.shutdownOutput(); socket.close(); socket = new Socket(addr, portNo); sockets.put(addr, socket); } catch (IOException e) { Log.e("getSocket: when closing and removing", ""); } } } else { try { socket = new Socket(addr, portNo); sockets.put(addr, socket); } catch (IOException e) { Log.e("getSocket: when creating", ""); } } return socket; } public void exit() { for (Iterator&lt;Socket&gt; iterator = sockets.values().iterator(); iterator.hasNext();) { Socket socket = (Socket) iterator.next(); try { socket.shutdownInput(); socket.shutdownOutput(); socket.close(); } catch (IOException e) { } } sockets.clear(); this.stopListening(); appManager = null; // timer.cancel(); } public int getListeningPort() { return this.listeningPort; } @Override public boolean sendFile(String ip, int port) { // TODO Auto-generated method stub try { String[] str = ip.split("\\."); byte[] IP = new byte[str.length]; for (int i = 0; i &lt; str.length; i++) { IP[i] = (byte) Integer.parseInt(str[i]); } Socket socket = getSocket(InetAddress.getByAddress(IP), port); if (socket == null) { return false; } Log.i("SocketOP", "sendFILE-1"); File f = new File("/sdcard/chats/gas.jpg/"); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f)); int readData; byte[] buffer = new byte[1024]; bis.read(buffer, 0,buffer.length); OutputStream os = socket.getOutputStream(); while((readData=bis.read(buffer))!=-1){ os.write(buffer,0,readData); Log.i("SocketOP", "sendFILE-3"); } } catch (IOException e) { return false; //e.printStackTrace(); } // Toast.makeText(this, "Lvbvhhging...", Toast.LENGTH_SHORT).show(); return true; } } </code></pre> <p>This is my IMService service that runs and calls startlistening. i am totally cluless. its giving me an error as suspected. how do i go about resolving this now.. IMService code block :</p> <pre><code>public void onCreate() { mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); // Display a notification about us starting. We put an icon in the status bar. // showNotification(); conManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); // Timer is used to take the friendList info every UPDATE_TIME_PERIOD; timer = new Timer(); Thread thread = new Thread() { @Override public void run() { //socketOperator.startListening(LISTENING_PORT_NO); Random random = new Random(); int tryCount = 0; while (socketOperator.startListening(10000 + random.nextInt(20000)) == 0 ) { tryCount++; if (tryCount &gt; 10) { // if it can't listen a port after trying 10 times, give up... break; } } } }; thread.start(); } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload