2012-07-25 45 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();