消息仅在Android应用程序在服务器上接收了一次 [英] Message only received once on the server on android app

查看:181
本文介绍了消息仅在Android应用程序在服务器上接收了一次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个服务器应用程序和客户端应用程序在不同的Andr​​oid设备单独运行,并从客户端应用程序在局域网调幅广播的消息,并且服务器监听,但问题是该消息只在服务器接收一次,我的客户code是:

 公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);    BT =(按钮)findViewById(R.id.myButton);
    bt.setOnClickListener(新View.OnClickListener(){        @覆盖
        公共无效的onClick(视图v){
            // TODO自动生成方法存根
             等=(EditText上)findViewById(R.id.EditText01);
             海峡= et.getText()的toString()。
                新主题(新的ClientThread())开始()。
        }
    });}/ *
 私人的InetAddress getBroadcastAddress()抛出IOException
        DhcpInfo DHCP = mWifi.getDhcpInfo();
        如果(DHCP == NULL){
          //Log.d(TAG,无法获取DHCP信息);
          返回null;
        }        INT广播=(dhcp.ipAddress&安培; dhcp.netmask)| 〜dhcp.netmask;
        字节[] =四边形新的字节[4];
        为(中间体K = 0; K&4;; k ++)
          四边形[K] =(字节)((广播>> K * 8)及为0xFF);
        返回InetAddress.getByAddress(四芯);
      }        * /类ClientThread实现Runnable {    @覆盖
    公共无效的run(){
        尝试{
            插座=新的DatagramSocket(SERVERPORT);            socket.setBroadcast(真);
           // Socket的(TIMEOUT_MS);
        }赶上(SocketException E){
            // TODO自动生成catch块
            e.printStackTrace();
        }            InetAddress类serverAddr = NULL;
            尝试{
                serverAddr = InetAddress.getByName(SERVER_IP);
            }赶上(UnknownHostException异常五){
                // TODO自动生成catch块
                e.printStackTrace();
            }      包=新的DatagramPacket(str.getBytes(),str.length(),serverAddr,SERVERPORT);            尝试{                    socket.send(包);                }赶上(IOException异常五){
                    // TODO自动生成catch块
                    e.printStackTrace();
                }
    }    }}

我的服务器类是:

 公共类MainActivity延伸活动{
私人布尔shouldRestartSocketListen =真;
TextView的TV1;
// MulticastLock锁;
静态字符串UDP_BROADCAST =UDPBroadcast;
DatagramSocket的插座= NULL;
@覆盖
公共无效的onCreate(捆绑savedInstanceState){    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);
TV1 =(的TextView)findViewById(R.id.textView1);
startListenForUDPBroadcast();}
私人无效listenAndWaitAndThrowIntent(InetAddress类broadcastIP,整数端口)抛出异常{
    字节[] = recvBuf新的字节[15000]
//如果(插座== NULL || socket.isClosed()){        //socket.setBroadcast(true);
//}
    //socket.setSoTimeout(1000);
    DatagramPacket类包=新的DatagramPacket(recvBuf,recvBuf.length);
    而(真)
    {
    插座=新的DatagramSocket(端口,broadcastIP);
    Log.e(UDP,等待UDP广播);
    socket.receive(包);//字符串senderIP = packet.getAddress()getHostAddress()。
    。字符串消息=新的String(packet.getData())修剪();// Log.e(UDP,+ senderIP +,从拿到UDB播出的消息:+消息);
    tv1.setText(消息);
    }
    // broadcastIntent(senderIP,消息);
// socket.close();}
私人无效broadcastIntent(字符串senderIP,字符串消息){
    意向意图=新意图(MainActivity.UDP_BROADCAST);
    intent.putExtra(发件人,senderIP);
    intent.putExtra(消息,消息);
    sendBroadcast(意向);
}
   螺纹UDPBroadcastThread;无效startListenForUDPBroadcast(){
    UDPBroadcastThread =新主题(新的Runnable(){
        公共无效的run(){
            尝试{
                InetAddress类broadcastIP = InetAddress.getByName(192.168.1.255); //172.16.238.42 //192.168.1.255
                整数端口= 11111;
                而(shouldRestartSocketListen){
                    listenAndWaitAndThrowIntent(broadcastIP,口);
                }
                //如果(shouldListenForUDPBroadcast!)抛出新的ThreadDeath();
            }赶上(例外五){
                Log.i(UDP,不再侦听错误的UDP广播原因+ e.getMessage());
            }
        }
    });
    UDPBroadcastThread.start();
}无效stopListen(){
    shouldRestartSocketListen = FALSE;
    socket.close();
}公共无效的onCreate(){};@覆盖
公共无效的onDestroy(){
    stopListen();
}公众的IBinder onBind(意向意图){
    返回null;
}
    }


解决方案

删除行 tv1.setText() listenAndWaitAndThrowIntent()。只有UI线程可以触摸的意见。如果您需要设置tv1.setText(),你需要做的是在UI线程中,也有这样几种方法,看<一个href=\"http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29\"相对=nofollow>这里。

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

解决方案

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.

这篇关于消息仅在Android应用程序在服务器上接收了一次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆