【问题标题】:Socket.io is not connecting in android, How to connect socket in android?Socket.io 没有在 android 中连接,如何在 android 中连接 socket?
【发布时间】:2021-06-26 03:43:49
【问题描述】:

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

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

【问题讨论】:

    标签: java android sockets websocket socket.io


    【解决方案1】:

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

    1. 检查您的套接字是否正确且工作正常,您可以在任何 网站或软件,以确保套接字正在连接。如果你的 套接字 url 正在工作,然后执行第二步。

    2. 像这样在应用程序类中初始化和连接套接字。

    a) 在清单中提及应用程序类。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2021-03-13
      • 2014-10-05
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多