2016-01-05 2 views
0

Я хотел бы завершить очень простое приложение: отправить TCP-пакет на сервер. Ответ сервера, на данный момент не имеет значения.Android newbie - клиент сокета без потока

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

Ошибка приложения в s.send(msg.serialized); и я не понимаю, почему.

Код в myActivity:

 final TcpSender s = new TcpSender(); 

     switch (tab_ID) { 
      case 1: 
       rootView = inflater.inflate(R.layout.fragment_tab1, container, false); 

       //----- btn_BotolaUp 
       final ToggleButton btn_light = (ToggleButton) rootView.findViewById(R.id.btn_light); 
       btn_light.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
         String toastmessage; 

         if (isChecked) { 
          msg.serialize("Identifier", "ON", "datafield1", "datafield2"); 
          toastmessage = "Light ON"; 
         } else { 
          msg.serialize("Identifier", "OFF", "datafield1", "datafield2"); 
          toastmessage = "Light OFF"; 
         } 

         s.send(msg.serialized); 
         Toast.makeText(rootView.getContext(), toastmessage, Toast.LENGTH_SHORT).show(); 
        } 
       }); 

      case.... 
       etc 

TcpSender Класс определяется следующим образом:

import android.util.Log; 

import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class TcpSender { 
Socket socket; 

public boolean send(String messagetosend) { 

    try { 
     InetAddress serverAddr = InetAddress.getByName("192.168.1.1"); 
     socket = new Socket(serverAddr, 10000); 
     Log.d("Net", "Socket created"); 

     PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
     Log.d("Net", "PrintWriter out"); 

     out.print(messagetosend); 
     Log.d("Net", "Message: " + messagetosend + " ->sent"); 
     socket.close(); 
     Log.d("Net", "Socket closed"); 

    } catch (UnknownHostException err) { 
     err.printStackTrace(); 
     Log.e("Net", "UnknownHostException err"); 
     return (false); 
    } catch (IOException err) { 
     err.printStackTrace(); 
     Log.e("Net","IOException err"); 
     return (false); 
    } 

    Log.d("Net","send successful!"); 
    return (true); 
} 

} 

Может кто-то помочь мне понять, что я делаю неправильно?

+1

В андроиде обычно вы получаете ошибку компиляции для UrlConnection и любой другой сетевой операции в основной теме. Я думаю, что это также относится к той же категории. Попробуйте сделать это в потоке –

+1

Какое исключение выбрасывается в logcat? – spartygw

+0

это сетевое исключение главной темы? –

ответ

2

Короткий ответ на ваш вопрос заключается в том, что вам понадобится отдельный поток, если вы хотите выполнять сетевые операции. Android не разрешает сетевые операции в основном потоке вашего приложения.

1

Google позволяет вам использовать основной поток для сетевых задач, и вот почему:

операции сети могут включать в себя непредсказуемые задержки. Чтобы это не вызвало плохой пользовательский интерфейс, всегда выполняйте сетевые операции в отдельном потоке из пользовательского интерфейса. Класс AsyncTask предоставляет один из простейших способов запуска новой задачи из потока пользовательского интерфейса.

и убедитесь, что соответствующие разрешения включены в манифест.

Вы можете выяснить эту проблему и узнать больше с помощью official docs.

+0

Итак, если я хорошо понял, мне нужно создать сокет, отправить пакет и закрыть сокет внутри одной и той же отдельной задачи ... Таким образом, я создам новую задачу (new connectTask(). Execute ("") ;) каждый раз мне нужно отправить пакет ... это нормально? Я выводю, что задача, однажды прекращенная, будет убита мусором? Это нормально ? – user1705850

Смежные вопросы