Message only received once on the server on android app

痴心易碎 提交于 2019-12-14 03:16:54

问题


I have a server app and client app running separately on different android devices and am broadcasting the message in LAN from client app and server is listening but the problem is that the message is only received once at server, My client code is:

         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();
                }
    } 

    }

}

My server class is:

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;
}
    }

回答1:


Remove the line tv1.setText() inside listenAndWaitAndThrowIntent(). Only the UI thread can touch views. If you need to set the tv1.setText() you need to do it in the UI thread, there are several methods for doing this, look here.



来源:https://stackoverflow.com/questions/18556332/message-only-received-once-on-the-server-on-android-app

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!