引起原因:libcore.io.ErrnoException:recvfrom失败:ECONNRESET(由对等方重置连接)和sendto失败:EPIPE(断开的管道)

时间:2020-08-12 10:41:55

标签: android sockets appauth

请不要将其标记为重复

你好 我正在创建一个Android应用,以从Google日历获取事件。我的设备没有Google Play服务,这是设备Philips 10bdl3051t / 02和Android版本4.4.4。 我已经通过App Auth从浏览器授权了用户,我已经获得了授权令牌并能够获取事件。该令牌在大约一小时内保持有效,然后需要刷新。 我正在使用以下代码刷新令牌。问题在于,有时它没有刷新的令牌并抛出此异常。

原因:libcore.io.ErrnoException:recvfrom失败:ECONNRESET(对等方重置连接)

原因:libcore.io.ErrnoException:sendto失败:EPIPE(管道损坏)

代码段以刷新令牌

private void checkGoogleCalendarRESTApiAuthToken() {
    SharedPreferences settings = getSharedPreferences(PREFS_FILE, 0);
    SharedPreferences.Editor editor = settings.edit();

    // only refresh the token when it is about to expire
    long timeDifference = settings.getLong("googleCalendarRESTApiAccessTokenExpiry", new Date().getTime()) - new Date().getTime();
    Log.d("authtoken", " googleCalendarRESTApiAccessTokenExpiry : " + String.valueOf(settings.getLong("googleCalendarRESTApiAccessTokenExpiry" , new Date().getTime())));
    Log.d("authtoken", " timeDifference: " + String.valueOf(timeDifference));
    if (timeDifference < 20) {
        Thread tokenRefreshTask = new Thread(){
        @Override
        public void run() {

            Log.d("authtoken", " tokenRefreshTask: " );
            mAuthState.performActionWithFreshTokens(new AuthorizationService(context), new AuthState.AuthStateAction() {
                @Override
                public void execute(@Nullable String accessToken, @Nullable String idToken, @Nullable AuthorizationException exception) {

                    Log.d("authtoken", " performActionWithFreshTokens: " );
                    editor.putString("googleCalendarRESTApiAccessToken", mAuthState.getAccessToken());
                    editor.putLong("googleCalendarRESTApiAccessTokenExpiry", mAuthState.getAccessTokenExpirationTime());
                    editor.apply();

                    HttpTransport transport = AndroidHttp.newCompatibleTransport();
                    JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
                    GoogleCredential googleAccountCredential = new GoogleCredential().setAccessToken(mAuthState.getAccessToken());
                    GoogleService = new com.google.api.services.calendar.Calendar.Builder(transport,jsonFactory,googleAccountCredential).build();


                    Log.d("authtoken", " getNeedsTokenRefresh: " + String.valueOf(mAuthState.getNeedsTokenRefresh()));
                    Log.d("authtoken", " getAccessTokenExpirationTime: " + String.valueOf(mAuthState.getAccessTokenExpirationTime()));
                    Log.d("authtoken", " getAccessToken: " + String.valueOf(mAuthState.getAccessToken()));
                    Log.d("authtoken", " isAuthorized: " + String.valueOf(mAuthState.isAuthorized()));
                    Log.d("authtoken", " getLastTokenResponse: " + String.valueOf(mAuthState.getLastTokenResponse()));
                    Log.d("authtoken", " getRefreshToken: " + String.valueOf(mAuthState.getRefreshToken()));
                    Log.d("authtoken", " getLastAuthorizationResponse: " + String.valueOf(mAuthState.getLastAuthorizationResponse()));
                }
            });
        }

    };tokenRefreshTask.start();
    }
}

此设备具有通过此代码控制的侧面LED,此代码每20秒运行一次,以使LED状态与日历事件保持同步。可能是这段代码造成了问题,如果发现任何问题,请提出修改建议。

// ledStripsColor = "#00FF00" for green
// ledStripsColor = "#FF0000" for red
// ledStripsMode = true
private void philipsLed(String ledStripsColor, boolean ledStripsMode) {

    Thread testing = new Thread() {
        @Override
        public void run() {
            Socket socket = null;
            OutputStream writer = null;
            int stripsColor = Color.parseColor(ledStripsColor);
            int mode = 0;
            if (ledStripsMode) {
                mode = 1; // 1 > turn on & 0 > turn off
            } else {
                mode = 0;
            }
            // Message //
            int messageSize = 9;
            int monitorId = 1;
            int groupId = 0;
            int command = 243; // To control the LED Strip
            int colorR = Color.red(stripsColor);
            int colorG = Color.green(stripsColor);
            int colorB = Color.blue(stripsColor);
            int checkSum = 0;

            List<Integer> list = new ArrayList<Integer>();
            list.clear();
            list.add(messageSize);
            list.add(monitorId);
            list.add(groupId);
            list.add(command);
            list.add(mode);
            list.add(colorR);
            list.add(colorG);
            list.add(colorB);

            for (int a = 0; a < 8; a++) {
                checkSum = checkSum ^ list.get(a);
            }

            try {
                // The server and the client is the same device so I used the loopback ip address.
                String ipAddress = "127.0.0.1";
                int portNo = 5000;
                socket = new Socket(ipAddress, portNo);
                socket.setKeepAlive( false );
                writer = socket.getOutputStream();

                writer.write((byte) messageSize);
                writer.write((byte) monitorId);
                writer.write((byte) groupId);
                writer.write((byte) command);
                writer.write((byte) mode);
                writer.write((byte) colorR);
                writer.write((byte) colorG);
                writer.write((byte) colorB);
                writer.write((byte) checkSum);
                writer.flush();
                writer.close();
                socket.close();
                
                // I have to run it multiple times as somehow it didn't change the colors of the LEDs at first time.
                // No.2 //
                socket = new Socket(ipAddress, portNo);
                socket.setKeepAlive( false );
                writer = socket.getOutputStream();

                sleep(100);

                writer.write((byte) messageSize);
                writer.write((byte) monitorId);
                writer.write((byte) groupId);
                writer.write((byte) command);
                writer.write((byte) mode);
                writer.write((byte) colorR);
                writer.write((byte) colorG);
                writer.write((byte) colorB);
                writer.write((byte) checkSum);
                writer.flush();
                writer.close();
                socket.close();

                // I have to run it multiple times as somehow it didn't change the colors of the LEDs at first time.
                // No.3 //
                socket = new Socket(ipAddress, portNo);
                socket.setKeepAlive( false );
                writer = socket.getOutputStream();

                sleep(100);

                writer.write((byte) messageSize);
                writer.write((byte) monitorId);
                writer.write((byte) groupId);
                writer.write((byte) command);
                writer.write((byte) mode);
                writer.write((byte) colorR);
                writer.write((byte) colorG);
                writer.write((byte) colorB);
                writer.write((byte) checkSum);

                writer.flush();
                writer.close();
                socket.close();

                Log.d("tag : ", "color send");
            } catch (final Exception e) {
                // TODO Auto-generated catch block
                Log.d("tag : ", "exception : " + e.getMessage());
                if (Toggle.toggle_Debug) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), "exception : " + e.getMessage(), Toast.LENGTH_SHORT).show();
                        }

                    });
                }
                e.printStackTrace();
            }
        }
    };
    testing.start();

}

谢谢

0 个答案:

没有答案
相关问题