[英]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();
}
我在這里做錯了什么? 我被困在這里,我明天有截止日期
我建議您執行以下操作:-
檢查您的插座是否正確且正常工作,您可以在任何網站或軟件中檢查它以確保插座正在連接。 如果您的插座 url 正常工作,請執行第二步。
像這樣在應用程序 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.