2013-06-14 1 views
0

Я написал небольшое клиентское серверное приложение для Android. Клиент - это Java-программа, работающая на моем ПК, а мой Android-телефон - это сервер. Я сталкиваюсь с силовыми проблемами в своей серверной программе. Сервер запускается довольно неплохо, но когда я отправляю строку с моего ПК-клиента, сила приложения (сервера) андроида закрывается. Это стало действительно раздражать. Пожалуйста помоги!Сбой сервера Android

Вот моя клиентская программа работает на моем компьютере:

package javaNetPackage; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import javax.swing.JOptionPane; 

public class javaClient { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) throws IOException { 

     Socket echoSocket = null; 
     PrintWriter out = null; 
     BufferedReader in = null; 
     String serverIpAddress = "10.81.242.220"; 

     try { 
      InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
      echoSocket = new Socket(serverAddr, 4444); 
      out = new PrintWriter(echoSocket.getOutputStream(), true); 
      in = new BufferedReader(new InputStreamReader(
             echoSocket.getInputStream())); 
     } catch (UnknownHostException e) { 
      System.err.println("Don't know about host"); 
      System.exit(1); 
     } catch (IOException e) { 
      System.err.println("Couldn't get I/O for " 
           + "the connection to server"); 
      System.exit(1); 
     } 

     String str = JOptionPane.showInputDialog("Please give number"); 
     out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(echoSocket.getOutputStream())),true); 
     out.println(str); 

    out.close(); 
    in.close(); 
    echoSocket.close(); 
    } 

} 

И вот мой код сервер, работающий на Android:

package com.vinit.androidserver; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.widget.TextView; 

public class MainActivity extends Activity { 
    ServerSocket ss = null; 
     String mClientMsg = ""; 
     Thread myCommsThread = null; 
     protected static final int MSG_ID = 0x1337; 
     public static final int SERVERPORT = 4444; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final TextView tv=(TextView)findViewById(R.id.textView1); 
     tv.setText("Nothing from client yet"); 
     this.myCommsThread = new Thread(new CommsThread()); 
     this.myCommsThread.start();  
    } 
    @Override 
     protected void onStop() { 
     super.onStop(); 
     try { 
      ss.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    Handler myUpdateHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
      case MSG_ID: 
       TextView tv = (TextView) findViewById(R.id.textView1); 
       tv.setText(mClientMsg); 
       break; 
      default: 
       break; 
      } 
      super.handleMessage(msg); 
     } 
     }; 

    class CommsThread implements Runnable { 
      public void run() { 
       Socket s = null; 
       try { 
        ss = new ServerSocket(SERVERPORT); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       while (!Thread.currentThread().isInterrupted()) { 
        Message m = new Message(); 
        m.what = MSG_ID; 
        try { 
         if (s == null) 
          s = ss.accept(); 
         BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
         String st = null; 
         st = input.readLine(); 
         mClientMsg = st; 
         myUpdateHandler.sendMessage(m); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
      } 
    } 

Права доступа:

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

Update :: Хорошо, я решил проблему силы. Я удалил теги разрешений в manifest.xml и повторно набрал их. Но сейчас у меня другая проблема. Отправленная строка с ПК-клиента не отображается на моем сервере TextView (textView1 в макете xml, называемом tv в коде сервера). Сообщение по умолчанию в телевизоре «Nothing from client yet». Когда я отправляю строку с ПК-клиента, сообщение по умолчанию исчезает, но отправленная строка не обновляется на сервере TextView (tv).

+1

Что сообщает журнал процессов Android о вашем процессе? Он даст вам имя и местоположение любого из возникающих исключений. –

ответ

0

Вы должны установить полученную строку на свой объект Message, посланный в myUpdateHandler.sendMessage(m); вместо вашего поля mClientMsg.

Вы можете создать и отправить Message объект, как показано ниже:

String st = null; 
st = input.readLine(); 
Message msg = Message.obtain(myUpdateHandler, MSG_ID, st); 
msg.sendToTarget(); 

Чтобы получить значение в обработчике,

case MSG_ID: 
    TextView tv = (TextView) findViewById(R.id.textView1); 
    tv.setText((String) msg.obj); 
    break; 

Я хотел бы предложить вам использовать Bundle объект вместо исходного объекта хоть. http://developer.android.com/reference/android/os/Message.html#setData(android.os.Bundle)

Причина, по которой вы заканчиваете пустую строку, заключается в том, что ваш обработчик и CommsThread работают в разных потоках и, таким образом, не используют один и тот же экземпляр mClientMsg.

Изменения в CommsThread до mClientMsg не отображаются в вашем обработчике.

+0

Спасибо большое! Извините за этот глупый вопрос! Почему мы не можем просто написать input.readLine() в textView (тот же поток)? –

+0

@VinitShandilya Вы можете поместить ссылку TextView в поле члена, например 'myCommsThread', и использовать это в своем потоке для установки содержимого TextView. – user2172816

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

  • Нет связанных вопросов^_^