Search code examples
androidsocketsserversocket

Unable to read data (send by server) at Client Side


I am trying to develop an app in which

1.client sends request to server for connection(IP address+PORT no.)+sends data using "PrintStream"+Tries to read the data from Server(Using Inputstream)

2.Client creates the socket.

3.Server reads the data send by Client

4.SERVER writes the data using "PrintStream" at same time point no 3.

Problem is at point 4 Data written by SERVER is not Read by "INPUTSTREAM" of client(Point 1) I dont know these Simultaneous operation are possible or not.If possible then how.If not then what is the alternate way?

Server Code

package com.example.loneranger.ser;


import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Enumeration;

public class MainActivity extends Activity {


    TextView ip;
    TextView msg;
    String data = "";

    ServerSocket httpServerSocket;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        ip = (TextView) findViewById(R.id.infoip);
        msg = (TextView) findViewById(R.id.msg);

        ip.setText(getIpAddress() + ":"
                + 8080 + "\n");

        Server server = new Server();
        server.start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (httpServerSocket != null) {
            try {
                httpServerSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private String getIpAddress() {
        String ip = "";
        try {
            Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
                    .getNetworkInterfaces();
            while (enumNetworkInterfaces.hasMoreElements()) {
                NetworkInterface networkInterface = enumNetworkInterfaces
                        .nextElement();
                Enumeration<InetAddress> enumInetAddress = networkInterface
                        .getInetAddresses();
                while (enumInetAddress.hasMoreElements()) {
                    InetAddress inetAddress = enumInetAddress.nextElement();

                    if (inetAddress.isSiteLocalAddress()) {
                        ip += "IP: "
                                + inetAddress.getHostAddress() + "\n";
                    }

                }

            }

        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            ip += "Something Wrong! " + e.toString() + "\n";
        }

        return ip;
    }

    private class Server extends Thread {


        @Override
        public void run() {
            Socket socket = null;

            try {
                httpServerSocket = new ServerSocket(8888);

                while(true){
                    socket = httpServerSocket.accept();

                    HttpResponseThread httpResponseThread =
                            new HttpResponseThread(
                                    socket);
                    httpResponseThread.start();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }


    }

    private class HttpResponseThread extends Thread {

        Socket socket;

        HttpResponseThread(Socket socket){
            this.socket = socket;

        }

        @Override
        public void run() {
            BufferedReader BReader;
            PrintWriter printer;
            String request;


            try { InputStream inputStream = socket.getInputStream();
                BReader = new BufferedReader(new InputStreamReader(inputStream));
                request = BReader.readLine();
Thread.sleep(500);
                printer = new PrintWriter(socket.getOutputStream(), true);


                printer.print("hello laundu");
                printer.flush();
                String ip123=socket.getInetAddress().toString();
                printer.close();

                BReader.close();

                socket.close();


                data += "Request of " + request
                        + " from "+ ip123 + "\n";
                MainActivity.this.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {

                        msg.setText(data);
                    }
                });

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            return;
        }
    }

}

Client Code

mport android.os.AsyncTask;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client extends AsyncTask<Void, Void, Void> {

    String dstAddress;
    int dstPort;
    String response = "";
    TextView textResponse;
    MainActivity activity;
    OutputStream outputStream;
    BufferedReader BReader;
    String request;

    Client(String addr, int port, TextView textResponse) {
        dstAddress = addr;
        dstPort = port;
        this.textResponse=textResponse;
        this.activity=activity;
    }

    @Override
    protected Void doInBackground(Void... arg0) {

        Socket socket = null;

        try {
            socket = new Socket(dstAddress, dstPort);
            Server server = new Server(socket);
            server.start();

            PrintWriter out = new PrintWriter(new BufferedWriter(

                    new OutputStreamWriter(socket.getOutputStream())),

                    true);

            out.print("futfujb");
            out.flush();




            /*
             * notice: inputStream.read() will block if no data return
             */


        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "UnknownHostException: " + e.toString();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "IOException: " + e.toString();
        } /*finally {
            if (socket != null) {
                try {

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }*/
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        textResponse.setText(response);
        super.onPostExecute(result);
    }
    private class Server extends Thread {
        Socket socket;
        Server(Socket socket)
        {
            this.socket=socket;
        }
        @Override
        public void run() {

                try { //Thread.sleep(500);

                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(
                            1024);
                    byte[] buffer = new byte[1024];

                    int bytesRead;
                    InputStream inputStream = socket.getInputStream();

                    if(inputStream.available()>0)
                    {
                        while ((bytesRead = inputStream.read(buffer)) != -1) {
                            byteArrayOutputStream.write(buffer, 0, bytesRead);
                            response += byteArrayOutputStream.toString("UTF-8");
                        }
                    }

                    inputStream.close();
                    socket.close();
            }
             catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }


        }


    }


}

Solution

  • As I commented above, there is nothing in this code that corresponds to either of these steps:

    2.Server gets the request creates new SOCKET connection.

    (a) There is no request, and (b) the server does not create a new connection. The client creates it. The server accepts it.

    3.Server reads the data send by Client.

    The client doesn't send any data.

    There are two problems here (at least):

    1. The server is blocking in readLine() waiting for a message that the client never sends. So it never gets to its own send, so nothing is received by the client. Have the client send a request, as per the comments.
    2. The client is incorrectly using available(). Remove this test and let the client fall through into the read loop. It will exit that when the peer (the server) closes the connection.