簡體   English   中英

Socket.io 在 android 中沒有連接,如何在 android 中連接插座?

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

我是 socket.io 的新手,我已經嘗試了我遇到的所有東西,但使用 connected() function 時仍然是錯誤的。

我已經檢查了我擁有的權限:

<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. 檢查您的插座是否正確且正常工作,您可以在任何網站或軟件中檢查它以確保插座正在連接。 如果您的插座 url 正常工作,請執行第二步。

  2. 像這樣在應用程序 class 中初始化並連接套接字。

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM