У клиента Android TCP в телефоне проблемы с внешним сервером - PullRequest
0 голосов
/ 25 января 2011

У меня TCP-клиент в Android (Java-программа в Eclipse).Сервер был еще одним Java-приложением, запущенным в Eclipse.В этой ситуации все работает нормально.

Когда я пытался получить сообщение от приложения моего коллеги (разработанного в 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();  
             }  
     }    
 }

Ответы [ 2 ]

0 голосов
/ 26 января 2011

Было решение, по крайней мере, на данный момент.Я использую readLine () для чтения содержимого сокетов, и это ожидает \ n или \ r или подобные символы, пока не вернет содержимое.Это не было проблемой для меня, когда и сервер, и клиент были в Java.Но когда клиент должен был получать сообщения из другого приложения, я столкнулся с этой проблемой.Это было преодолено простым добавлением \ n в конец сообщения, отправленного другим приложением.

0 голосов
/ 25 января 2011

Это проблема с SERVERIP здесь. Вы запускаете свое приложение из эмулятора на своем локальном компьютере? Ваш эмулятор не является частью вашей локальной сети. Эмулятор работает за виртуальным маршрутизатором / брандмауэром, который изолирует его от сетевых интерфейсов и настроек компьютера, на котором выполняется разработка, и от Интернета.

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

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

...