Socket.io 未在 android 中连接,如何在 android 中连接套接字?

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

我是 socket.io 的新手 我已经尝试了我遇到的一切,但在使用 connected() 函数时仍然是错误的。

我已经检查了我拥有的权限:

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

我也用过:android:usesCleartextTraffic="true"

这是我的代码:

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();
}

我在这里做错了什么?我被困在这里,明天有截止日期

我建议您执行以下操作:-

  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) 在清单中提及应用程序 class。

b) 创建一个 class 并在你的项目中使用这个 class

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;
    }

}