2013-02-19 3 views
0

моя проблема сегодняшней заключается в следующем:сетей односторонняя связь андроида

У меня есть подключение к сети, в которой обе стороны должны посылать команды (байт), но мой читатель блокирует мой писатель, вот как это кажется. Если я «отключу» своего читателя (удалив читателя из источника), писатель работает так, как должен, но когда мой читатель тоже там, мой писатель делает половину работы.

Допустим, мой писатель должен отправить команду с интервалом в 15 секунд и не забывать о входящих командах, на которые должен отвечать небольшой байтовый блок. Блок ответа отправляется, но команда из интервала кажется заблокированной.

Вот мой источник:

protected String doInBackground(URL... params) { 
     try { 
      btw1 = (byte) sendbeg; 
      btw2 = (byte) w2; 
      btw3 = (byte) w3; 
      btw4 = (byte) w4; 
      btw5 = (byte) w5; 
      if (w5 == 79) { 
       btw6 = (byte) mins; 
       btw7 = (byte) seks; 
       btw8 = (byte) w6; 
       btw9 = (byte) sendend; 
      } else { 
       btw6 = (byte) w6; 
       btw7 = (byte) sendend; 
      } 
      SocketAddress sockaddr = new InetSocketAddress("192.168.0.7", 2001); 
      sock = new Socket(); 
      int timeout = 1000; // 1000 millis = 1 second 
      sock.connect(sockaddr, timeout); 
      sock.setReuseAddress(true); 
      System.out.println(sock); 
      DataOutputStream dos = new DataOutputStream(
        (OutputStream) sock.getOutputStream()); 
      BufferedWriter wrtr = new BufferedWriter(
        new OutputStreamWriter(dos), 300); 
      DataInputStream dis = new DataInputStream(sock.getInputStream()); 
      BufferedReader rdr = new BufferedReader(new InputStreamReader(dis), 
        300); 
      getbyte((byte) btw1, (byte) btw2, (byte) btw3, (byte) btw4, 
        (byte) btw5, (byte) btw6, (byte) btw7, (byte) btw8, 
        (byte) btw9, (byte) btw10); //getbyte works fine, too. It's just there for putting the single bytes into an array. 
      System.out.println(btw.length); 
      dos.write(btw); 
      diny1 = (dis).read();   
diny2 = (dis).read();   
diny3 = (dis).read();   
diny4 = (dis).read(); 

      diny5 = (dis).read();   
dinymin = (dis).read(); 
      dinysek = (dis).read(); 
      diny6 = (dis).read(); 
      diny7 = (dis).read(); 
      if (diny5 != 79) { 
       System.out.println("diny" + diny1 + " " + diny2 + " " + diny3 
         + " " + diny4 + " " + diny5 + " " + dinymin + " " 
         + dinysek); 
      } else { 
       if (diny7 != 5) { 
        diny6 = 0; 
        diny7 = 0; 
       } 
       System.out.println("diny" + diny1 + " " + diny2 + " " + diny3 
         + " " + diny4 + " " + diny5 + " " + dinymin + " " 
         + dinysek + " " + diny6 + " " + diny7); 
      } 
      dos.close(); 
      wrtr.close(); 
      dis.close(); 
      rdr.close(); 
      if (diny5 != 32) { 
       sendbeg = 3; 
       w2 = diny3; 
       w3 = diny2; 
       w4 = 48; 
       w5 = 32; 
       w6 = 11; 
       sendend = 5; 
       System.out.println(diny5 + " ^^ "); 
       doInBackground(); 

      } 
      System.out.println("case 144-49-000.1" + context); 
      reccom(context); 
      sock.close(); 

     } catch (Exception e) { 
      e.printStackTrace(); 

      System.out.println("IO error " + e); 
     } 

     return "Done"; 
    } 

Мой intervalsource работает отлично, потому что это работает, если читатель не активен, поэтому я думаю, что проблема в этом коде выше. пожалуйста помоги.

ответ

1
  • Вы можете удалить звонок setReuseAddress(); это только для серверных сокетов.
  • AsyncTask - не совсем подходящий класс для ваших читателей и писателей , если вы остаетесь в цикле там все время; было бы более целесообразно использовать Thread.
  • Звучит так, как будто вам нужен отдельный читатель и писатель Thread, если не разрешено блокировать другого.
  • Вы, вероятно, придется использовать synchronized по пути, если читатель и писатель действуют независимо
+0

хмм ТНХ до сих пор, я не имею никакого опыта в использовании потоков, так что это будет немного трудно, я думаю. Я буду расценивать ваши намеки – Ekonion

+0

Самая большая проблема заключается в том, чтобы различать ответы и команды на принимающей стороне, я думаю; вам понадобится какая-то государственная машина, которую я бы предположил. Использование потоков легко; просто создайте объект Runnable (класс с методом run()) и не создавайте его. Проблемы с потоками: синхронизация данных (приемник и отправитель может запускаться параллельно) и завершение (когда ваша активность прекращается, ваши потоки должны это знать). –

+0

надеюсь, что вы правы, «используя потоки легко» ^^, но вы уже помогли мне в этом. Теперь я буду запугивать сайт разработчика developer.android.com немного ^^ – Ekonion