2015-06-14 7 views
0

Я пытаюсь отправить одну строку с android на компьютер и после небольшого исследования на этом сайте и других, которые я узнал о сокетах и ​​как их использовать. Я написал программу сервера, которая может получать переданные ей строки. Ниже приведен код.Клиентский сокет на android

//static ServerSocket variable 
    private static ServerSocket server; 
    //socket server port on which it will listen 
    private static int port = 9021; 

    public static void main(String [] args) throws IOException, ClassNotFoundException{ 

     server = new ServerSocket(port); 


     while(true){ 
      System.out.println("Waiting for client request." + InetAddress.getLocalHost()); 

      Socket socket = server.accept(); 

      ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 

      String message = (String)ois.readObject(); 
      System.out.println("Message received: " + message); 

      ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 

      oos.writeObject("Hi Client: " + message); 

      ois.close(); 
      oos.close(); 
      socket.close(); 


      if(message.equalsIgnoreCase("exit")){ 
       break; 
      } 
     } 
     System.out.println("Shutting down serve"); 

     server.close(); 
    } 

Я тестировал это с помощью клиентской программы pc, которая отправляет строку и подтверждает, что этот скрипт сервера работает. Я пытаюсь реализовать ту же концепцию в android, но сталкиваюсь с множеством проблем, в основном из-за того, что учебники онлайн для этой задачи очень устарели (2-3 года), поэтому ничего не работает, как ожидалось. Может ли кто-нибудь сказать мне, как написать очень простое приложение для Android, в котором одна строка отправляется через сокет?

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

Редактировать: В соответствии с решением я реализовал асинтез. Но теперь сервер не получает и говорит, что адрес уже используется. Я думаю, что это из-за адреса сокета в моем коде Android. Пожалуйста помоги!

public class MainActivity extends Activity { 


    private Button button; 
    private EditText message; 
    private TextView finalResult; 


    //InetAddress host; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     message = (EditText) findViewById(R.id.et_time); 
     button = (Button) findViewById(R.id.btn_do_it); 
     finalResult = (TextView) findViewById(R.id.tv_result); 

     /* 
     try { 
      host = InetAddress.getLocalHost(); 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }*/ 

     button.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       AsyncTaskRunner runner = new AsyncTaskRunner(); 
       String msg = message.getText().toString(); 
       runner.execute(msg); 

      } 
     }); 

    } 



    private class AsyncTaskRunner extends AsyncTask<String, String, String> { 


     Socket socket = null; 
     ObjectOutputStream oos = null; 
     ObjectInputStream ois = null; 
     int clientport = 8080; 
     String resp; 

     @Override 
     protected String doInBackground(String... params) { 
      publishProgress("Sending..."); 

      String msg = params[0]; 


      for(int i=0;i<=5;i++){ 

       //establish socket connection to server 
       try { 
        socket = new Socket("100.69.73.16",clientport); 
        //write to socket using Objectouputstream 
        oos = new ObjectOutputStream(socket.getOutputStream()); 
        oos.writeObject(msg+i); 


        oos.close(); 
        socket.close(); 
        Thread.sleep(100); 
       } catch (UnknownHostException e) { 
         e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 


      } 



      resp = "Message has been sent"; 
      return resp; 

     } 

     @Override 
     protected void onPostExecute(String result) { 


      finalResult.setText(result); 
     } 

     @Override 
     protected void onPreExecute() { 


     } 

     @Override 
     protected void onProgressUpdate(String... values) { 

      finalResult.setText(values[0]); 
     } 

    } 


} 
+0

Во-первых, вы должны использовать Asynctask, в которой вы делаете подключение к серверу. – Dien

+0

Как вы подключились к ПК? Через Wi-Fi? Или по сети? –

+0

Благодарим вас за предложение асинхронности. Я написал приложение, используя это, и ему удалось отправить сообщение. Но теперь мой сервер не получает его. Он вызывает ошибку и говорит - адрес уже используется: JVM_bind. Я добавлю свой код приложения для Android в исходное сообщение, чтобы вы могли посмотреть. Aiyaz, это более Wi-Fi. Спасибо за интерес! – Zod

ответ

0

Итак, я решил проблему «адреса, уже используемого», изменив номер порта. По-видимому, номер порта использовался другими программами на моем ноутбуке. Поэтому в ретроспективе для тех, кто проверяет, как это сделать, вы можете использовать мой код выше и не забудьте изменить номер порта в обоих кодах на что-то подобное. Также в моем коде Android, где открыт сокет, вы можете установить локальный IP-адрес (очень важный, google дает вам внешний) для вашего компьютера.

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