Android Socket is showing "Connected" when a Client Request connection but "cant send messages"

106 Views Asked by At

So,It's like the title Say's i have created a Simple android Socket server and Client which Connects over Wifi. Both devices are on the same Wifi Network. The Server Shows the IP Address on which it host the connection....And in the client You have to write the IP Address on which Server is hosted.....

So, My problem is when i am Entering The IP Address in the Client The Server shows "Connected". But when i start to send messages it doesn't send the message to other side neither Server to Client nor Client to server.

//#Server Java File
package inc.teckzy.wif_chat;

import android.net.wifi.WifiManager;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.format.Formatter;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Helper extends AppCompatActivity {
    EditText smessage;
    TextView chat,display_status;
    String str,msg="";
    int serverport = 6666;
    ServerSocket serverSocket;
    Socket client;
    Handler handler = new Handler();
    WifiManager wmanager;
    Boolean Alive;
    DataOutputStream out;
    DataInputStream in;
    Button button_sent;


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

        wmanager = (WifiManager) getSystemService(WIFI_SERVICE);
        @SuppressWarnings("deprecation")
        String ip = Formatter.formatIpAddress(wmanager.getConnectionInfo().getIpAddress());
        smessage = (EditText) findViewById(R.id.smessage);
        chat = (TextView) findViewById(R.id.chat);
        display_status = (TextView) findViewById(R.id.display_status);

        Thread serverThread = new Thread(new serverThread());
        serverThread.start();
        Alive = serverThread.isAlive();
        display_status.setText("Hosted on: " + ip);
        button_sent = (Button) findViewById(R.id.button_sent);
        button_sent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Thread sentThread = new Thread(new sentMessage());
                sentThread.start();
            }
        });
}

    class sentMessage implements Runnable{
        @Override
        public void run() {
            try{
                client = serverSocket.accept();
                out = new DataOutputStream(client.getOutputStream());
                str = smessage.getText().toString();
                msg = msg+"\n Server:" +str;
                handler.post(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        chat.setText(msg);
                    }
                });
                out.writeBytes(str);
                out.flush();
                out.close();
                client.close();

            }catch(IOException e){}
        }
    }

    public class serverThread implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    serverSocket = new ServerSocket(serverport);
                    client = serverSocket.accept();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            display_status.setText("Connected");
                        }
                    });
/*******************************************
 setup i/p streams
 ******************************************/
                    in = new DataInputStream(client.getInputStream());
                    String line = in.readUTF();
                    while (!line.equals("STOP")) {
                        msg = msg + "\n Client : " + line;
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                chat.setText(msg);
                            }
                        });
                    }
                    in.close();
                    client.close();
                }
            } catch (Exception e) {
            }

        }
    }
}

//#Client Side Java File
package reciever;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.*;
import java.net.*;

import inc.teckzy.wif_chat.R;

public class ClientSide extends AppCompatActivity {
    EditText serverIp,smessage;
    TextView chat;
    String serverIpAddress = "",msg = "",str;
    Handler handler = new Handler();
    Button sent,connectPhones;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_client_side);
        chat = (TextView) findViewById(R.id.chat);
        serverIp = (EditText) findViewById(R.id.server_ip);
        smessage = (EditText) findViewById(R.id.smessage);
        sent = (Button) findViewById(R.id.sent_button);
        connectPhones = (Button) findViewById(R.id.connect_phones);

        //-----------------------Connecting to IP------------------------------//
        connectPhones.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                serverIpAddress = serverIp.getText().toString();
                if (!serverIpAddress.equals(""))
                {
                    Thread clientThread = new Thread(new
                            ClientThread());
                    clientThread.start();
                }
            }
        });
        //-------------------------------Initializing sent thread----------------//
        sent.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Thread sentThread = new Thread(new sentMessage());
                sentThread.start();
            }
        });

    }
class sentMessage implements Runnable
{
    @Override
    public void run()
    {
        try
        {
            InetAddress serverAddr =
                    InetAddress.getByName(serverIpAddress);
            Socket socket = new Socket(serverAddr, 6666); //
            DataOutputStream os = new DataOutputStream(socket.getOutputStream());
            str = smessage.getText().toString();
            str = str + "\n";
            msg = msg + "Client : " + str;
            handler.post(new Runnable() {
                @Override
                public void run() {
                    chat.setText(msg);
                }
            });
            os.writeUTF(str);
            os.flush();
            os.close();
            socket.close();
        }
        catch(IOException e)
        {
        }
    }
}

    public class ClientThread implements Runnable
    {
        InetAddress serverAddr;
        public void run()
        {
            try
            {
                while(true)
                {
                    serverAddr = InetAddress.getByName(serverIpAddress);
                    Socket socket = new Socket(serverAddr, 6666);
/*******************************************
 setup i/p streams
 ******************************************/
                    DataInputStream in = new
                            DataInputStream(socket.getInputStream());
                    String line = in.readUTF();
                    while (!line.equals("Stop"))
                    {
                        msg = msg + "Server : " + line + "\n";
                        handler.post(new Runnable()
                        {
                            @Override
                            public void run()
                            {
                                chat.setText(msg);
                            }
                        });
                    }
                    in.close();
                    socket.close();
                    Thread.sleep(100);
                }

            }
            catch (Exception e)
            {}
        }
    }
}
2

There are 2 best solutions below

0
Nishant Tiwari On BEST ANSWER

I Solved it Just deleted the "sentMessage" Thread and implemented output stream in "sent.setOnClickListener(new View.OnClickListener()" in both Activity also did some modifications..Here is the working code Activity ...Hope this will help someone

#Server Activity
package inc.teckzy.wifi_chat;

import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.text.format.Formatter;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Helper extends AppCompatActivity {
    EditText smessage;
    TextView chat,display_status;
    String str,Smsg,Cmsg="";
    int serverport = 6666;
    ServerSocket serverSocket;
    Socket client;
    Handler updateConversationHandler =new Handler();
    WifiManager wmanager;
    DataOutputStream out;
    DataInputStream in;
    Button button_sent;
    StringWriter errors = new StringWriter();


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

        wmanager = (WifiManager) getSystemService(WIFI_SERVICE);
        @SuppressWarnings("deprecation")
        String ip = Formatter.formatIpAddress(wmanager.getConnectionInfo().getIpAddress());
        smessage = (EditText) findViewById(R.id.smessage);
        chat = (TextView) findViewById(R.id.chat);
        display_status = (TextView) findViewById(R.id.display_status);



        Thread serverThread = new Thread(new serverThread());
        serverThread.start();

        display_status.setText("Hosted on: " + ip);
        button_sent = (Button) findViewById(R.id.button_sent);


        button_sent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                        out = new DataOutputStream(client.getOutputStream());
                        str = smessage.getText().toString();
                        Smsg = "Server:" + str;
                        updateConversationHandler.post(new updateUIThread(Smsg));
                        out.writeUTF(str);
                        out.flush();
                }catch (Exception e) {
                    e.printStackTrace(new PrintWriter(errors));
                    updateConversationHandler.post(new updateUIThread(errors.toString()));
                }
                smessage.getText().clear();
            }
        });
}

    public class serverThread implements Runnable {
        @Override
        public void run() {
            try {
                serverSocket = new ServerSocket(serverport);
                while (true) {
                    client = serverSocket.accept();
                    updateConversationHandler.post(new updateUIThread("Connected"));
/*******************************************
 setup i/p streams
 ******************************************/
                    in = new DataInputStream(client.getInputStream());
                    String line = "";
                    while (!line.equals("STOP")) {
                        line=in.readUTF();
                        Cmsg ="Client: "+ line;
                        updateConversationHandler.post(new updateUIThread(Cmsg));
                    }
                    in.close();
                    client.close();
                }
            } catch (Exception e) {
                e.printStackTrace(new PrintWriter(errors));
                updateConversationHandler.post(new updateUIThread(errors.toString()));
            }

        }
    }

    class updateUIThread implements Runnable {
        private String msg;
        updateUIThread(String str) {
            this.msg = str;
        }
        @Override
        public void run() {
            chat.setText(chat.getText().toString()+ msg + "\n");
        }
    }
    @Override
    protected void onStop() {
        super.onStop();
        try {
            // MAKE SURE YOU CLOSE THE SOCKET UPON EXITING
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

And

    #Client Activity
package inc.teckzy.wifi_chat.reciever;

import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.text.format.Formatter;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.InetAddress;
import java.net.Socket;

import inc.teckzy.wifi_chat.R;

public class ClientSide extends AppCompatActivity {
    EditText serverIp,smessage;
    TextView chat;
    String serverIpAddress = "",Smsg,Cmsg = "",str;
    Handler updateConversationHandler = new Handler();
    Button sent,connectPhones;
    Socket socket;
    DataInputStream in;
    DataOutputStream out;
    StringWriter errors = new StringWriter();
    WifiManager wmanager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_client_side);
        chat = (TextView) findViewById(R.id.chat);
        serverIp = (EditText) findViewById(R.id.server_ip);
        wmanager = (WifiManager) getSystemService(WIFI_SERVICE);
        smessage = (EditText) findViewById(R.id.smessage);
        sent = (Button) findViewById(R.id.sent_button);
        connectPhones = (Button) findViewById(R.id.connect_phones);

        //-----------------------Connecting to IP------------------------------//
        connectPhones.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                serverIpAddress = serverIp.getText().toString();
                if (!serverIpAddress.equals(""))
                {
                    Thread clientThread = new Thread(new
                            ClientThread());
                    clientThread.start();
                }
            }
        });
        //-------------------------------Initializing sent thread----------------//
        sent.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                try {
                    out = new DataOutputStream(socket.getOutputStream());
                    str = smessage.getText().toString();
                    Cmsg = "Client: " + str;
                    updateConversationHandler.post(new updateUIThread(Cmsg));
                    out.writeUTF(str);
                    out.flush();
                }catch(Exception e){
                    e.printStackTrace(new PrintWriter(errors));
                    updateConversationHandler.post(new updateUIThread(errors.toString()));}
                smessage.getText().clear();
            }
        });

    }

    public class ClientThread implements Runnable
    {
        InetAddress serverAddr;
        public void run()
        {
            try
            {
                serverAddr = InetAddress.getByName(serverIpAddress);
                socket = new Socket(serverAddr, 6666);

                updateConversationHandler.post(new updateUIThread("Connected"));
                String ip = socket.getRemoteSocketAddress().toString();
                updateConversationHandler.post(new updateUIThread(ip));
                out = new DataOutputStream(socket.getOutputStream());
                in = new DataInputStream(socket.getInputStream());
/*******************************************
 setup i/p streams
 ******************************************/
                    String line = "";
                    while (!line.equals("Stop")) {
                        line=in.readUTF();
                        Smsg ="Server: " + line + "\n";
                        updateConversationHandler.post(new updateUIThread(Smsg));
                    }
                    out.close();
                    in.close();
                    socket.close();

            }
            catch (IOException e)
            {updateConversationHandler.post(new updateUIThread("IO Error"));}
        }
    }
    class updateUIThread implements Runnable {
        private String msg;
        updateUIThread(String str) {
            this.msg = str;
        }
        @Override
        public void run() {
            chat.setText(chat.getText().toString()+ msg + "\n");
        }
    }
    @Override
    protected void onStop() {
        super.onStop();
        try {
            // MAKE SURE YOU CLOSE THE SOCKET UPON EXITING
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
0
Nabin Bhandari On

You are using client = serverSocket.accept(); in server side every time you need to send a message.

And in client side you are trying to create a new Socket connection using new Socket (serverAddr, 6666); multiple times.

Maintain a single Socket connection and single data input/output stream(do not create multiple instances) and you will be good to go.

See example at:

https://github.com/nabinbhandari/android-socket-messaging