2011-01-25 8 views
0

私はAndroidにTCPクライアントを持っています(EclipseのJavaプログラム)。サーバーはEclipseで動作する別のJavaアプリケーションでした。この状況ではすべてがうまくいきます。携帯電話のAndroid TCPクライアントに外部サーバとの通信に問題があります

私の同僚のアプリ(Rhapsodyで開発され、私はC++だと思う)からメッセージを受け取ろうとしたとき、自分のアプリが閉じられていてメッセージが送信されていない間だけメッセージを受け取ります。なぜこのようなことが起こったのか考えていますか?

時間と労力をいただきありがとうございます。

乾杯、 マドゥ

Javaサーバは、このようなものです:

public class TCPSendServer implements Runnable{ 
    public static final String SERVERIP = "192.168.178.24"; 
    public static final int SERVERPORT = 1200; 
    //static Category cat = Category.getInstance(TCPSendServer.class.getName()); 
    //cat.debug("Start of main()"); 

    public void run() { 
     try { 
      System.out.println("S: Connecting...");    
      ServerSocket serverSocket = new ServerSocket(SERVERPORT); 
      String msg = "<MSG><N>shiftDirection</N><V>1</V></MSG>"; 
      String msg1 = "<MSG><N>vehicleSpeed</N><V>120</V></MSG>"; 
      String msg2 = "SD<!N><V>0<!V><!MSG>"; 

      //while (true) { 
       Socket client = serverSocket.accept(); 

        try { 
         System.out.println("S: Sending: '" + msg + "'"); 
         PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())),true);      
         Thread.sleep (5000); 
         out.println(msg); 
         Thread.sleep (5000); 
         //out.println(msg2); 
         Thread.sleep (5000); 
         out.println(msg1); 
         //out.flush(); 
         System.out.println("S: Sent."); 
         System.out.println("S: Done."); 
        } catch(Exception e) { 
         System.out.println("S: Error"); 
         e.printStackTrace(); 
        } //finally { 
         // client.close();       
        //} 
      //} 
     } catch (Exception e) { 
      System.out.println("S: First try error"); 
      e.printStackTrace(); 
     } 
    } 

    public static void main (String a[]) { 
     Thread desktopServerThread = new Thread(new TCPSendServer()); 
     desktopServerThread.start(); 
    } 
} 

Androidのクライアントコード: 主な活動:

public class TCPListen extends Activity implements TCPListener { 
    private TextView mTitle; 
    public String data[] = new String[2]; 

    /** Called when the activity is first created. */ 
    @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      //setContentView(R.layout.main);    

      // Set up the window layout 
      requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
      setContentView(R.layout.main); 
      getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title); 

      // Set up the custom title 
      mTitle = (TextView) findViewById(R.id.title_left_text); 
      mTitle.setText(R.string.app_name); 
      mTitle = (TextView) findViewById(R.id.title_right_text); 

      //TcpServiceHandler handler=new TcpServiceHandler(this); 
      //handler.execute("192.168.178.24"); 

      TcpServiceHandler handler = new TcpServiceHandler(this,this); 
      Thread th = new Thread(handler); 
      th.start();    
     }   

     public String[] callCompleted(String source){ 
       Log.d("TCP", "Std parser " + source); 
       mTitle.setText(source); 
       //String data[] = new String[2]; 

       //if (source.matches("<MSG><N>.*</N><V>.*</V></MSG>")) {   
        Document doc = null; 
        try{ 
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
         DocumentBuilder db = dbf.newDocumentBuilder(); 
         doc = (Document) db.parse(new ByteArrayInputStream(source.getBytes())); 
         NodeList n = doc.getElementsByTagName("N"); 
         Node nd = n.item(0); 
         String msgName = nd.getFirstChild().getNodeValue(); 
         NodeList n1 = doc.getElementsByTagName("V"); 
         Node nd1 = n1.item(0); 
         String tmpVal = nd1.getFirstChild().getNodeValue(); 
         data[0] = msgName; 
         data[1] = tmpVal; 
         Log.d("TCP", "Inside Std parser " + data[0] + " " + data[1]); 
         //actionOnData(data[0], data[1]); 
         } 
        catch(Exception e){ 
        e.printStackTrace(); 
       } 
       Log.d("TCP", "Just outside Std parser " + data[0] + " " + data[1]); 
       return data; 
       //} else Log.d("TCP", "Message in wrong format " + source); 
       //mTitle.setText("Message in wrong format " + source); 
       //return data; 
      } 

インタフェース:

public interface TCPListener { 
    public String[] callCompleted(String msg); 
} 

TCPServiceHandler:

public class TcpServiceHandler implements Runnable { 
    TCPListener _listener;    
    private Activity _act; 
    public TcpServiceHandler(TCPListener listener, Activity act){  
     _listener = listener; 
     _act = act; 
    }   

    public synchronized void run() { 
     // TODO Auto-generated method stub   
     //if(socket==null){  
      try { 
       InetAddress serverAddr = InetAddress.getByName("192.168.178.25"); 
       Socket socket = new Socket(serverAddr, 1200); 
     // 
       while(true){ 
        try {       
         BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
         final String str = in.readLine(); 
         this._act.runOnUiThread(new Runnable(){ 

         public void run() { 
          _listener.callCompleted(str); 
          }         
         });             
        } 
        catch(Exception e){ 
         e.printStackTrace(); 
        } 
       } 
      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
    }  
} 

答えて

0

これはここSERVERIPの問題です。ローカルマシンのエミュレータからアプリを実行していますか?エミュレータはLANの一部ではありません。エミュレータは、仮想ルータ/ファイアウォールサービスの背後で実行され、開発マシンのネットワークインターフェイスや設定、およびインターネットから隔離します。

したがって、別のマシンにあるサーバーとの通信を実現するには、ネットワークリダイレクトまたはポート転送を使用する必要があります。

デバイスでアプリケーションを実行している場合は、そのデバイスをネットワークの一部として作成することができます。

+0

Androidの電話(HTC Desire)でクライアントコードを実行します。サーバーがEclipseで実行されているJavaアプリケーションの場合、このサーバーから送信されたデータをAndroidフォンで受信できます。別のアプリ(サーバーとして動作すると見なすことができるabc)からデータを受信しようとすると、アプリに接続できますが、データは受信できません。実際の電話をabcに接続するのではなく、クライアントをエミュレータから接続しようとすると、abcが閉じられた後にのみデータを受信できます。実際の電話とabcは動作していません - 接続は確立されていますが、データはありません –

+0

ありがとうございます。ネットワークリダイレクトとポート転送について詳しく説明してください。私はAndroid上でサーバを稼働させていたときにポート転送を使用しました。例:adb forward tcp:6100 tcp:7100)。また、私は自分のAndroid携帯電話を、外部サーバーが接続されているのと同じWLANに接続します。また、ネットワークの一部であるデバイス(Android端末と思われる)を説明する場合にも役立ちます。 –

0

少なくとも時間は解決策がありました。私はソケットの内容を読むためにreadLine()を使います。これは内容を返すまで\ nまたは\ rまたは類似の文字を期待します。サーバーとクライアントの両方がJavaになっていたとき、これは私の問題ではありませんでした。しかし、クライアントが別のアプリからメッセージを受け取らなければならないとき、私はこの問題に直面しました。他のアプリから送信されたメッセージの最後に\ nを追加するだけで克服できました。

関連する問題