2016-05-17 4 views
-1

Я разрабатываю приложение iOs, которое требуется для отправки и получения сообщения от приложения Android Host.GCDAsyncSocket: хост android не может получить данные, написанные клиентом iOS

Приложение для Android-хоста создаст Wifi Hotpot программно, устройство iOS присоединится к нему из настройки.

Во-первых, я попытался использовать класс NSOutputStream от Apple для записи на хост. Но не повезло. Теперь я запускаю пример ConnectionTest GCDAsyncSocket. Но хост Android не может читать данные, написанные клиентом iOS.

КОД установить соединение

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

dispatch_queue_t mainQueue = dispatch_get_main_queue(); 

    asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:mainQueue]; 

NSString *host = HOST; 
     uint16_t port = PORT; 

     DDLogInfo(@"Connecting to \"%@\" on port %hu...", host, port); 
     self.viewController.label.text = @"Connecting..."; 

     NSError *error = nil; 
     if (![asyncSocket connectToHost:host onPort:port error:&error]) 
     { 
      DDLogError(@"Error connecting: %@", error); 
      self.viewController.label.text = @"Oops"; 
     } 
// Add the view controller's view to the window and display. 
    [self.window addSubview:self.viewController.view]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

код для записи данных, когда соединение установлено

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port 
    { 
     DDLogInfo(@"socket:%p didConnectToHost:%@ port:%hu", sock, host, port); 
     self.viewController.label.text = @"Connected"; 

     NSString *requestStr = @"girsh:"; 
      NSMutableData *requestData = [[NSMutableData alloc] initWithData:[requestStr dataUsingEncoding:NSUTF8StringEncoding]]; 

      [requestData appendData:[GCDAsyncSocket CRLFData]]; 

      [sock writeData:requestData withTimeout:1 tag:1]; 
} 

***** ANDROID КОДА ********

private void startHotspot() { 
////////////////// 
     if (wifiManager.isWifiEnabled()) { 
      wifiManager.setWifiEnabled(false); 
     } 
     Method[] wmMethods = wifiManager.getClass().getDeclaredMethods(); 
     boolean methodFound = false; 
     for (Method method : wmMethods) { 
      if (method.getName().equals("setWifiApEnabled")) { 
       methodFound = true; 
       Calendar calendar = Calendar.getInstance(); 

       WifiConfiguration netConfig = new WifiConfiguration(); 
       netConfig.SSID = "AISTT" + "What_Next" + calendar.get(Calendar.MINUTE) + "." + calendar.get(Calendar.SECOND); 
       netConfig.preSharedKey = "DataAnywhere";//getString(R.string.password); //// Password 
       netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); 
       netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
       try { 
        boolean apstatus = (Boolean) method.invoke(wifiManager, netConfig, true); 

        for (Method isWifiApEnabledmethod : wmMethods) { 
         if (isWifiApEnabledmethod.getName().equals("isWifiApEnabled")) { 
          while (!(Boolean) isWifiApEnabledmethod.invoke(wifiManager)) { 
          } 

          for (Method method1 : wmMethods) { 
           if (method1.getName().equals("getWifiApState")) { 
            int apstate; 
            apstate = (Integer) method1.invoke(wifiManager); 
            Log.i(this.getClass().toString(), "Apstate ::: " + apstate); 
           } 
          } 
         } 
        } 
        if (apstatus) { 
         Log.d("Splash Activity", "Access Point created"); 
        } else { 
         Log.d("Splash Activity", "Access Point creation failed"); 
        } 

       } catch (IllegalArgumentException e) { 
        e.printStackTrace(); 
       } catch (IllegalAccessException e) { 
        e.printStackTrace(); 
       } catch (InvocationTargetException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     if (!methodFound) { 
      Log.d("Splash Activity", 
        "cannot configure an access point"); 
     } 

     /////////////////// 
    } 
+0

Успешно ли установлено соединение? Вы удостоверились, что это часть iOS, которая не записала данные успешно, или часть Android не смогла получить данные успешно? Пожалуйста, добавьте больше кодов и деталей. Для этой проблемы может быть много факторов. –

+0

Да. Я думаю, что соединение было успешно установлено. –

+0

Он называется - (void) socket: (GCDAsyncSocket *) sock didConnectToHost: (NSString *) host port: (UInt16) port –

ответ

1

Я видел пару ошибок в вашем коде.

Первая часть заключается в следующем:

dispatch_queue_t mainQueue = dispatch_get_main_queue(); 

asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:mainQueue]; 

Вы запускаете соединение в основной очереди, которая не является хорошим способом. Потому что каким-то образом вы можете заблокировать основной поток. Или другие операции, идущие в основной поток, заблокируют вас.

Что я буду делать, я поставлю соединение в поток, отличный от основного.

_asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)]; 

Вторая часть заключается в следующем:

[sock writeData:requestData withTimeout:1 tag:1]; 

Вы просто установить тайм-аут до 1. Это слишком мало, по крайней мере, установить его на , или просто установить его в -1 (То, что я обычно делал), без тайм-аута. Поскольку может быть случай, когда запись не была успешной, тогда соединение не будет перезаписывать данные снова, потому что тайм-аут будет достигнут.

Вы также можете проверить, если запись прошла успешно или нет через этот обратный вызов:

- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag 

Если все в порядке в вашем IOS части. Затем я предлагаю вам проверить кодировку на части Android.

+0

Спасибо JLT. Я внесу изменения в код, как вам было предложено. –

+0

Я вношу изменения в код. Когда я записываю данные в поток, он вызывает следующий метод. - (void) socket: (GCDAsyncSocket *) носок сделалWriteDataWithTag: (длинный) тег –

+0

Как бороться с частью Android? Все еще ничего не получили? –