简体   繁体   中英

Socket.io is not connecting in android, How to connect socket in android?

I'm new to socket.io I have tried everything I came across but still it's false when is use the connected() function.

I've checked the permissions I have both of:

<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

I have also used: android:usesCleartextTraffic="true"

This is my code:

public class LoginFragment extends Fragment {

    FragmentLoginBinding binding;
    private NavController controller;
    private Socket socket;
    {
        try {
            socket = IO.socket(TimeAndData.getSocketURL());// it's something like this "http://xxx.xxx.xxx.xxx:xxxx"
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {


        controller = Navigation.getInstance().getController();
        binding = FragmentLoginBinding.inflate(getLayoutInflater(),container,false);

        socket.connect();

        binding.loginBtn.setOnClickListener(v -> {
            if(!binding.etUsername.getText().toString().isEmpty()) {
                if(!binding.etPass.getText().toString().isEmpty()) {
                    binding.loginBtn.setClickable(false);
                    submit();
                }
            }
        });



        return binding.getRoot();
    }

    private void submit() {
        binding.progressBar.setVisibility(View.VISIBLE);
        RequestQueue rq = Volley.newRequestQueue(requireContext());

        StringRequest jor = new StringRequest(Request.Method.POST, TimeAndData.getLoginURL(), responseStr ->  {

            JsonObject object = new Gson().fromJson(responseStr, JsonObject.class);
            binding.progressBar.setVisibility(View.GONE);
            if(object.get("status").getAsInt()==200) {

                TimeAndData.setDisplayName(object.get("displayName").getAsString());
                TimeAndData.setBalance(object.get("balance").getAsString());
                TimeAndData.setFullName(object.get("fullName").getAsString());
                TimeAndData.setUserId(object.get("userId").getAsString());
                TimeAndData.setUserName(object.get("userName").getAsString());


                initSocket(object.get("userId").getAsString());

                //controller.navigate(R.id.navigation_choice);
            }else if(object.get("status").getAsInt()==401){
                Toast toast = Toast.makeText(requireContext(), object.get("msg").getAsString(),Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.TOP,0,0);
                toast.show();
                binding.progressBar.setVisibility(View.GONE);
                binding.loginBtn.setClickable(true);
            }else {
                Toast toast = Toast.makeText(requireContext(), "Internal Server Error",Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.TOP,0,0);
                toast.show();
                binding.progressBar.setVisibility(View.GONE);
                binding.loginBtn.setClickable(true);
            }


        }, error -> Toast.makeText(getContext(), error.getMessage(), Toast.LENGTH_SHORT).show()){
            @Override
            public String getBodyContentType() {
                return "application/x-www-form-urlencoded";
            }

            @Override
            protected Map<String, String> getParams()
            {
                Map<String, String>  params = new HashMap<>();
                params.put("userName", binding.etUsername.getText().toString());
                params.put("password", binding.etPass.getText().toString());

                return params;
            }
        };

        rq.add(jor);
    }

    private void initSocket(String agent_id) {


        
        Toast toast = Toast.makeText(requireContext(), String.valueOf(socket.connected()),Toast.LENGTH_SHORT);//shows false
        toast.setGravity(Gravity.TOP,0,0);
        toast.show();
}

What am I doing wrong here? I'm stuck here and I have deadline tomorrow

I would suggest you to do these following things:-

  1. Check your socket is correct and working, you can check it in any website or software to make sure socket is being connected. If your socket url is working then do this second step.

  2. Initialise and connect socket in application class like this.

a) Mention application class in manifest.

b) Create a class and use this class in your project

import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;


public class ApplicationClass extends Application {
    public static final String TAG = ApplicationClass.class.getSimpleName();
    private static ApplicationClass mInstance;
    public static io.socket.client.Socket mSocket;

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(base);

    }

    @Override
    public void onCreate() {
        super.onCreate();
        initializeSocket();
        mInstance = this;
    }

    private void initializeSocket() {
        IO.Options options = new IO.Options();
        options.forceNew = true;
        options.reconnection = true;
        options.reconnectionDelay = 2000;
        options.reconnectionDelayMax = 5000;
        try {
            mSocket = IO.socket(WebAPIUrls.SOCKET_URL);
            mSocket.on(Socket.EVENT_CONNECT, onConnect);
            mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
            mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
            mSocket.on(Socket.EVENT_DISCONNECT, onDisconnect);
            if(!mSocket.connected()){
                mSocket.connect();
            }
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }

    }
    public Emitter.Listener onConnect = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.d(TAG, "Socket Connected!");
        }
    };

    private Emitter.Listener onConnectError = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.d(TAG, "onConnectError");
        }
    };
    private Emitter.Listener onDisconnect = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.d(TAG, "onDisconnect");
           /* if(!mSocket.connected()){
                mSocket.connect();
            }*/
        }
    };
   

    public static synchronized ApplicationClass getInstance() {
        ApplicationClass appController;
        synchronized (ApplicationClass.class) {
            appController = mInstance;
        }
        return appController;
    }
   
    public static Socket returnSocketInstance() {
        return mSocket;
    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM