代码贴上,有点多,但是简单:
package xiaobenben.muticast;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Scanner;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 Muticast extends Activity {
    /** Called when the activity is first created. */
   private Button button_send;
   private TextView textview;
   private Button button_begin;
   private EditText edittext;
   
   private static final String BROADCAST_IP = "224.0.0.1";
public static final int BROADCAST_PORT = 4545;
private static final int DATA_LEN = 4096;
private MulticastSocket socket ;
private InetAddress broadcastAddress = null;
private Scanner scan = null;
byte[] inBuff = new byte[DATA_LEN];
private DatagramPacket inPacket = new DatagramPacket(inBuff , inBuff.length);
private DatagramPacket outPacket = null;
private String str;

public void ini(){
try{
socket = new MulticastSocket(BROADCAST_PORT);
System.out.println("1111111111111111111");
broadcastAddress = InetAddress.getByName(BROADCAST_IP);
socket.joinGroup(broadcastAddress);
socket.setLoopbackMode(false);
outPacket = new DatagramPacket(new byte[0] , 0 ,broadcastAddress , BROADCAST_PORT);
}catch (Exception e){
e.printStackTrace();
}
}

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        button_send = (Button)findViewById(R.id.button_ok);
        button_begin = (Button)findViewById(R.id.button_begin);
        textview = (TextView)findViewById(R.id.textview_text);
        edittext = (EditText)findViewById(R.id.editview);
        textview.setText("hi,xiaobenben!");
        button_begin.setText("开始");
        
        ini();
        
        button_begin.setOnClickListener(new Button.OnClickListener(){ public void onClick(View v) {
// TODO Auto-generated method stub
try {
System.out.println("init() start");
button_begin.setText("结束");
Runnable ping = new Multicast();
new Thread(ping).start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
        
        });
        
        
        
        button_send.setOnClickListener(new Button.OnClickListener(){ public void onClick(View v) {
// TODO Auto-generated method stub
try{
//scan = new Scanner(Muticast.this.edittext.getText().toString());
     str = edittext.getText().toString();
//byte[] buff = scan.next().getBytes();
byte[] buff = str.getBytes();
outPacket.setData(buff);
socket.send(outPacket);
edittext.setText("");

}catch (Exception e){
e.printStackTrace();
}

}
        
        });
       
    }

class Multicast implements Runnable{ //内部类

Multicast(){
}
public void run(){
try
{
while(true)
{

socket.receive(inPacket);
System.out.println(new String(inBuff , 0 , inPacket.getLength()));
str = new String(inBuff , 0 , inPacket.getLength());
textview.setText("聊天信息:" + str);
//textview.setText("聊天信息:" + new String(inBuff , 0 , inPacket.getLength()));
//System.out.println(inPacket.getAddress().getHostAddress());
}
}

catch (IOException ex)
{
ex.printStackTrace();
try
{
if (socket != null)
{

socket.leaveGroup(broadcastAddress);

socket.close();
}
System.exit(1); 
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}其实就是实现 局域网聊天的小程序罢了

解决方案 »

  1.   

    DDMS中报的error会影响你的运行吗?
      

  2.   

    错误写的很清楚,只有主线程中可以去直接对VIEW操作。
    Multicast的run中
                  textview.setText("聊天信息:" + str);这个要放在主线程里可以这样:
    activity中创建一个handler,然后在Multicast的run中,str接收完了,然后通过handler发消息来通知UI更新。改成这样:
                    socket.receive(inPacket);
                    System.out.println(new String(inBuff , 0 , inPacket.getLength()));
                    str = new String(inBuff , 0 , inPacket.getLength());//这个str最好定义一个全局的,不然还要通过bundle来传递
                    handler.sendEmptyMessage(1);//ID自己定义然后handler里handlemessage中根据msg的id==1来做
    textview.setText("聊天信息:" + str);的工作
      

  3.   

    多谢两位的解答,现在已经解决了,但是:又发现了一个问题:button_send.setOnClickListener(new Button.OnClickListener(){            public void onClick(View v) {
                    // TODO Auto-generated method stub
                    try{
                        //scan = new Scanner(Muticast.this.edittext.getText().toString());
                             str = edittext.getText().toString();
                            //byte[] buff = scan.next().getBytes();
                            byte[] buff = str.getBytes();
                            outPacket.setData(buff);
                            socket.send(outPacket);
                            edittext.setText("");
                        
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                    
                }
                
            });
           
        }
    我先在EditText输入8个字节的消息,然后点击发送按钮发送后,然后第二次即使在EditText输入10个字节,但是也只是发送了前8个字节,也就是说每次发送的字节数最多就是上次发送消息的字节数,这是为什么呢?代码有什么问题吗?该怎么改呢?
      

  4.   


    正解android中确实需要这种Handler机制来处理在其他线程中控制主线程的UI.
      

  5.   

    这样的问题上google一搜就能解决,没必要发帖,太慢了!