0

我有一个服务器应用程序和客户端应用程序在不同的 android 设备上分别运行,并且正在从客户端应用程序和服务器在 LAN 中广播消息,但问题是消息只在服务器上接收一次,我的客户端代码是:

         public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);     

    bt=(Button)findViewById(R.id.myButton);
    bt.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub


             et = (EditText) findViewById(R.id.EditText01);
             str = et.getText().toString();
                new Thread(new ClientThread()).start();
        }
    });



}

/*
 private InetAddress getBroadcastAddress() throws IOException {
        DhcpInfo dhcp = mWifi.getDhcpInfo();
        if (dhcp == null) {
          //Log.d(TAG, "Could not get dhcp info");
          return null;
        }

        int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
        byte[] quads = new byte[4];
        for (int k = 0; k < 4; k++)
          quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
        return InetAddress.getByAddress(quads);
      }

        */

class ClientThread implements Runnable {

    @Override
    public void run() {


        try {
            socket = new DatagramSocket(SERVERPORT);

            socket.setBroadcast(true);
           //               socket.setSoTimeout(TIMEOUT_MS);
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

            InetAddress serverAddr = null;
            try {


                serverAddr = InetAddress.getByName(SERVER_IP);


            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

      packet = new DatagramPacket(str.getBytes(), str.length(),serverAddr,SERVERPORT);

            try {

                    socket.send(packet);

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    } 

    }

}

我的服务器类是:

public class MainActivity extends Activity {
private Boolean shouldRestartSocketListen=true;
TextView tv1;
//MulticastLock lock;
static String UDP_BROADCAST = "UDPBroadcast";
DatagramSocket socket=null;
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
tv1=(TextView)findViewById(R.id.textView1);


startListenForUDPBroadcast();

}


private void listenAndWaitAndThrowIntent(InetAddress broadcastIP, Integer port) throws Exception {
    byte[] recvBuf = new byte[15000];
//  if (socket == null || socket.isClosed()) {

        //socket.setBroadcast(true);
//  }
    //socket.setSoTimeout(1000);
    DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
    while(true)
    {
    socket = new DatagramSocket(port, broadcastIP);
    Log.e("UDP", "Waiting for UDP broadcast");
    socket.receive(packet);

//  String senderIP = packet.getAddress().getHostAddress();
    String message = new String(packet.getData()).trim();

//  Log.e("UDP", "Got UDB broadcast from " + senderIP + ", message: " + message);
    tv1.setText(message);
    }
    //  broadcastIntent(senderIP, message);
//  socket.close();

}
private void broadcastIntent(String senderIP, String message) {
    Intent intent = new Intent(MainActivity.UDP_BROADCAST);
    intent.putExtra("sender", senderIP);
    intent.putExtra("message", message);
    sendBroadcast(intent);
}
   Thread UDPBroadcastThread;

void startListenForUDPBroadcast() {
    UDPBroadcastThread = new Thread(new Runnable() {
        public void run() {
            try {
                InetAddress broadcastIP =           InetAddress.getByName("192.168.1.255"); //172.16.238.42 //192.168.1.255
                Integer port = 11111;
                while (shouldRestartSocketListen) {
                    listenAndWaitAndThrowIntent(broadcastIP, port);
                }
                //if (!shouldListenForUDPBroadcast) throw new ThreadDeath();
            } catch (Exception e) {
                Log.i("UDP", "no longer listening for UDP  broadcasts cause of error " + e.getMessage());
            }
        }
    });
    UDPBroadcastThread.start();
}



void stopListen() {
    shouldRestartSocketListen = false;
    socket.close();
}

public void onCreate() {

};

@Override
public void onDestroy() {
    stopListen();
}



public IBinder onBind(Intent intent) {
    return null;
}
    }
4

1 回答 1

0

去掉tv1.setText()里面的线listenAndWaitAndThrowIntent()。只有 UI 线程可以触摸视图。如果你需要设置 tv1.setText() 你需要在 UI 线程中进行,有几种方法可以做到这一点,看这里

于 2013-09-01T08:10:24.633 回答