2012-07-25 82 views
0

我不熟悉Android和Java編程。我必須在未來做一個更大的項目,包括一些android開發。所以我看過一些Videotutorials,現在我試着做一些應用來訓練自己。現在我想用兩個Android設備(摩托羅拉Defy和三星Galaxy Tab 2 7.0)之間的聊天服務。從Android到Android設備的UDP聊天

這裏是我的兩個設備代碼:

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.SocketException; 
import java.net.UnknownHostException; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class udpserver extends Activity implements View.OnClickListener { 

Button Send; 
EditText IPAdresse; 
EditText TEXT; 
TextView RXtext,tstep,rstep; 
private static final int TIMEOUT_MS = 1000; 
private static final int server_port = 13011; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.udpserver); 

    IPAdresse = (EditText) findViewById(R.id.etIPAdresse); 
    TEXT = (EditText) findViewById(R.id.etTEXT); 
    Send = (Button) findViewById(R.id.bSendaa); 
    RXtext = (TextView) findViewById(R.id.tvRXtext); 
    tstep = (TextView) findViewById(R.id.tvTstep); 
    rstep = (TextView) findViewById(R.id.tvRstep); 
    Send.setOnClickListener(this); 


    String text; 
    byte[] message = new byte[1500]; 
    DatagramSocket s; 


    //while(true){ 
    try { 
     s= new DatagramSocket(server_port); 
                rstep.setText("1"); 
     s.setBroadcast(true); 
                rstep.setText("2"); 
     s.setSoTimeout(TIMEOUT_MS); 
                rstep.setText("3"); 
     while(true){ 
     DatagramPacket p = new DatagramPacket(message, message.length); 
                rstep.setText("4"); 
     //InetAddress test = InetAddress.getByName("192.168.1.101"); 
      //          rstep.setText("5"); 
     //s.connect(test,12345); 
      //          rstep.setText("6"); 
     s.receive(p); 
                rstep.setText("xxx"); 

     text = new String(message, 0, p.getLength()); 
     RXtext.setText(text); 
     } 
    } catch (SocketException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     rstep.setText("fail socket create"); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     rstep.setText("fail receive"); 
    } 

    } 
//} 






public void onClick(View arg0) { 
    // TODO Auto-generated method stub 
    switch(arg0.getId()){ 
    case R.id.bSendaa: 
                   tstep.setText("1"); 
     String messageStr= TEXT.getText().toString(); 
                   tstep.setText("2"); 

     DatagramSocket s; 
     try { 
      s = new DatagramSocket(); 
                   tstep.setText("3"); 
      s.setBroadcast(true); 
                   tstep.setText("4"); 
      s.setSoTimeout(TIMEOUT_MS); 
                   tstep.setText("5"); 
      InetAddress local = InetAddress.getByName(IPAdresse.getText().toString()); 
                   tstep.setText("6"); 
      int msg_length=messageStr.length(); 
                   tstep.setText("7"); 
      byte[] message = messageStr.getBytes(); 
                   tstep.setText("8"); 
      DatagramPacket p = new DatagramPacket(message, msg_length,local,server_port); 
                   tstep.setText("9"); 
      s.connect(local,server_port); 
                   tstep.setText("10"); 
      s.send(p); 
                   tstep.setText("sending complete"); 


     } catch (SocketException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      tstep.setText("sending failed"); 
     } 



    } 
} 

}

和我的UI看起來像這樣(有翻譯)

enter image description here

我現在的問題是:我可以只在活動開始時接收1s(1s = TIMOUT_MS)。但我想收到整個時間。我試圖使用一段時間(真)循環,但應用程序總是與它崩潰。

在此先感謝! (對不起我的英語,我知道它不是最好的:))

回答

0

發生什麼事情是,當你這樣做的時候,你將會陷入無限循環。這就是爲什麼你的應用程序崩潰。你需要做的是開始一個新的thread,將做s.receive(p)。例如:

new Thread(new Runnable() { 
    public void run() { 

     while(true){ 
     DatagramPacket p = new DatagramPacket(message, message.length); 
                rstep.setText("4"); 
     //InetAddress test = InetAddress.getByName("192.168.1.101"); 
      //          rstep.setText("5"); 
     //s.connect(test,12345); 
      //          rstep.setText("6"); 
     s.receive(p); 
                rstep.setText("xxx"); 

     text = new String(message, 0, p.getLength()); 
     runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      RXtext.setText(text); 
     } 
    }); 

       } 
}).start();