简体   繁体   English

在Android应用程序的服务器上仅收到一次消息

[英]Message only received once on the server on android app

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: 我有一个服务器应用程序和客户端应用程序分别在不同的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();
                }
    } 

    }

}

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

Remove the line tv1.setText() inside listenAndWaitAndThrowIntent() . 删除tv1.setText() listenAndWaitAndThrowIntent() Only the UI thread can touch views. 只有UI线程可以触摸视图。 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 . 如果您需要在UI线程中设置tv1.setText(),则有几种方法可以执行此操作,请参见此处

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 通过蓝牙接收的消息在android应用程序中拆分 - Received message through Bluetooth is splitted in android app 开始我的第一个Android应用程序 如何轻松测试服务器是否收到消息? - Starting my first android app. How can I easily test if the server has received a message? 仅在应用程序处于前台时才收到Android通知 - Android notifications only received if app is in foreground 在 Android 中的 Java Websocket 服务器收到消息时,不会创建 Toast 消息 - Toast Message is not created when message received at Java Websocket server in Android Android C2DM 消息在 App Engine 端收到确认 - Android C2DM message received confirmation at App Engine side 服务器/ Android客户端仅接收/发送一次 - Server/Android client receives/sends only once 为什么我的消息在Java套接字服务器中仅发送一次? - Why is my message sent only once in Java socket server? Android TCP客户端/服务器未正确传递消息(仅首次接收) - Android TCP Client/Server not passing messages properly (Only first received) 在android套接字中:在服务器中仅接收到array []的一部分,套接字中是否有最大大小? - in android socket: in the server only part of the array[] is received, is there a max size in socket? 在服务器上从android应用接收的数据始终为null - data received on server from android app always null
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM