在线等待,求高手,socket发送延迟问题
2017-01-02 14:45
323 查看
在线等待。
我的app可以按取颜色(色盘与固定颜色的button),使用tcp socket传输,让灯可以根据按的颜色做改变。
目前碰到的问题是:
1. 前面动作都可以正常执行,但按取到后面时就会产生延迟的问题发生。颜色还是可按取,但灯不会变色,但时间超过很久(超过1分钟或更久)灯就会照刚才按取的颜色依序变色。
2. 按取的动作快一点(ex:连击),程序就会整个崩溃。
3. 程序崩溃后,灯就会以非常快的速度改变,刚才不会变灯色之后所按取的颜色。
我会发送类似这样的讯息:
这是我写的程序
我的app可以按取颜色(色盘与固定颜色的button),使用tcp socket传输,让灯可以根据按的颜色做改变。
目前碰到的问题是:
1. 前面动作都可以正常执行,但按取到后面时就会产生延迟的问题发生。颜色还是可按取,但灯不会变色,但时间超过很久(超过1分钟或更久)灯就会照刚才按取的颜色依序变色。
2. 按取的动作快一点(ex:连击),程序就会整个崩溃。
3. 程序崩溃后,灯就会以非常快的速度改变,刚才不会变灯色之后所按取的颜色。
我会发送类似这样的讯息:
getActivity().startService(new Intent(getActivity(), NotificationService.class) .setAction(NotificationService.ACTION_SENT) .putExtra(NotificationService.EXTRA_PARAM_TARGET_ADDR, "192.168.1.1") .putExtra(NotificationService.EXTRA_PARAM_TARGET_PORT, 1281) .putExtra(NotificationService.EXTRA_PARAM_TARGET_DATA, cmd));
这是我写的程序
public class NotificationService extends Service { private static final String DATAGRAM_TARGET_ADDR_DEF = "192.168.168.254"; private static final int DATAGRAM_TARGET_PORT_DEF = 12098; public static final String ACTION_SENT = "ACTION_SENT"; public static final String EXTRA_PARAM_TARGET_ADDR = "EXTRA_PARAM_TARGET_ADDR"; public static final String EXTRA_PARAM_TARGET_PORT = "EXTRA_PARAM_TARGET_PORT"; public static final String EXTRA_PARAM_TARGET_DATA = "EXTRA_PARAM_TARGET_DATA"; public static final String ACTION_DNS = "ACTION_DNS"; public static final String EXTRA_PARAM_LOOKUP_ADDR = "EXTRA_PARAM_LOOKUP_ADDR"; //private static Context ctx = null; private static ConcurrentLinkedQueue<Map<String, Object>> mQueueSend = new ConcurrentLinkedQueue<>(); //private static ConcurrentLinkedQueue<Map<String, Object>> queueRecv = new ConcurrentLinkedQueue<>(); private static Thread mThreadConn = null; private static Thread mThreadSend = null; private static Thread threadRecv = null; private static final Lock mMutexSocket = new ReentrantLock(true); private static final Lock mMutexTxData = new ReentrantLock(true); private static final Lock mMutexRxData = new ReentrantLock(); private static InetSocketAddress address = new InetSocketAddress(DATAGRAM_TARGET_ADDR_DEF, DATAGRAM_TARGET_PORT_DEF); private static Socket socket = null; private static OutputStream output = null; private static InputStream input = null; private static BufferedWriter writer = null; private static BufferedReader reader = null; private static final Runnable mRunnableConnDev = new Runnable() { @Override public void run() { try { Log.d(this.getClass().getSimpleName(), "5. new Socket ---> TRY!"); mMutexSocket.lock(); //socket = new Socket("192.168.168.254", 12098); socket = new Socket(DATAGRAM_TARGET_ADDR_DEF, DATAGRAM_TARGET_PORT_DEF); Log.d(this.getClass().getSimpleName(), "7. new Socket ---> OK!"); writer = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream())); reader = new BufferedReader(new InputStreamReader( socket.getInputStream())); } catch ( SocketException e ) { Log.d(this.getClass().getSimpleName(), "new Socket ---> NG!"); } catch (UnknownHostException e) { e.printStackTrace(); Log.d(this.getClass().getSimpleName(), "new Socket ---> Exception!"); } catch (IOException e) { e.printStackTrace(); Log.d(this.getClass().getSimpleName(), "new Socket ---> Exception!"); } finally { mMutexSocket.unlock(); } /* do some delays */ try { mThreadConn.sleep(100); Log.i(this.getClass().getSimpleName(), "11. Socket delay some time"); } catch ( InterruptedException e ) { } } }; private static final Runnable btRunnableSendData = new Runnable() { @Override public void run() { Map<String, Object> map = null; while ( true ) { mMutexTxData.lock(); if ( false == mQueueSend.isEmpty() ) { map = mQueueSend.peek(); Log.i(this.getClass().getSimpleName(),"get mQueueSend head:"+map); mMutexTxData.unlock(); if ( false == map.containsKey(EXTRA_PARAM_TARGET_DATA) ) continue; Log.d(this.getClass().getSimpleName(), "6. TCP:have R data"); mMutexSocket.lock(); if ( false == address.equals(socket.getRemoteSocketAddress())) { mMutexSocket.unlock(); Log.i(this.getClass().getSimpleName(), "1010101010101010101010"); /* do some delays */ try { mThreadSend.sleep(100); Log.i(this.getClass().getSimpleName(), "12. send delay some time"); } catch ( InterruptedException e ) { } continue; } mMutexSocket.unlock(); try { mMutexSocket.lock(); final byte[] bytes = map.get(EXTRA_PARAM_TARGET_DATA).toString().getBytes(); String cmd = new String(bytes, StandardCharsets.UTF_8); writer.write(cmd + "\n"); writer.flush(); mThreadSend.sleep(100); } catch ( IOException e ) { } catch ( InterruptedException e ) { 4000 } finally { mMutexSocket.unlock(); } mQueueSend.poll(); continue; } mMutexTxData.unlock(); } } }; private static final Runnable btRunnableRecvData = new Runnable() { @Override public void run() { while ( true ) { } } }; public static final BroadcastReceiver btStateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { } }; @Override public void onCreate() { Log.i("NotificationService", "socket:onCreate~~~"); Log.i(this.getClass().getSimpleName(), "in thread number:"+Thread.activeCount()); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(this.getClass().getSimpleName(), "1. socket:onStartCommand~~~"); if ( null != intent && null != intent.getAction() ) { Map<String, Object> map = new HashMap<>(); if ( ACTION_SENT.equals(intent.getAction()) ) { if ( true == intent.hasExtra(EXTRA_PARAM_TARGET_ADDR) && true == intent.hasExtra(EXTRA_PARAM_TARGET_PORT) && true == intent.hasExtra(EXTRA_PARAM_TARGET_DATA) ) { /* prepare target address & port */ mMutexSocket.lock(); address = new InetSocketAddress( intent.getStringExtra(EXTRA_PARAM_TARGET_ADDR), intent.getIntExtra(EXTRA_PARAM_TARGET_PORT, DATAGRAM_TARGET_PORT_DEF)); mMutexSocket.unlock(); /* start thread to connect */ //if ( null == mThreadConn || Thread.State.TERMINATED.equals(mThreadConn.getState()) ) { mThreadConn = new Thread(mRunnableConnDev); mThreadConn.start(); //} /* prepare tx data */ map.put(EXTRA_PARAM_TARGET_ADDR, intent.getStringExtra(EXTRA_PARAM_TARGET_ADDR)); map.put(EXTRA_PARAM_TARGET_PORT, intent.getIntExtra(EXTRA_PARAM_TARGET_PORT, DATAGRAM_TARGET_PORT_DEF)); map.put(EXTRA_PARAM_TARGET_DATA, intent.getStringExtra(EXTRA_PARAM_TARGET_DATA)); /* put tx data into queue */ mMutexTxData.lock(); mQueueSend.add(map); mMutexTxData.unlock(); /* start thread to transfer */ //if ( null == mThreadSend || Thread.State.TERMINATED.equals(mThreadSend.getState()) ) { mThreadSend = new Thread(btRunnableSendData); Log.i(this.getClass().getSimpleName(),"new senddata thread"); mThreadSend.start(); Log.i(this.getClass().getSimpleName(),"thread start...."); Log.i(this.getClass().getSimpleName(),"first Send Data:"+data); //} } } } return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { //Log.i("NotificationService", "onDestroy~~~"); //unregisterReceiver(btStateReceiver); if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } super.onDestroy(); } @Override public IBinder onBind(Intent intent) { return null; } }
相关文章推荐
- 在线等待,求高手,socket发送延迟问题
- J2ME 发送彩信问题,请个位高手帮忙,长时间在线等待
- node使用socket断开后延迟发送的问题解决
- linux下sctp socket发送延迟问题
- java在线聊天项目0.5版 解决客户端向服务器端发送信息时只能发送一次问题 OutputStreamWriter DataOutputStream socket.getOutputStream()
- 使用MulticastSocket发送组播包无法获取IGMP包的问题
- 如何打开Windows MCI接口的问题?在线等待!!
- timage组件判断是否有图片小问题,高手进,在线等.....
- java Socket 客户端向服务器端发送流(不是文件),服务器端read出现阻塞问题
- C# Socket tcp 发送数据大小问题
- socket 发送缓冲区问题
- [VB.NET]两个socket通讯问题,人在线等
- c++和java在socket通信过程中发送和接收函数的问题
- 通过 Socket 发送 Http协议 上传图片到速卖通服务器过程中遇到的一些小的问题 总结
- QT 3G SOCKET发送接收问题
- linux socket无延迟发送数据
- java中使用DatagramSocket在线发送对象
- [VB.NET]大容量文件编码转换问题,高手请进,在线等
- socket 发送消息 DataOutputStream write vs writeUTF8 编码问题
- spymemcached 的 useNagle 问题与 TCP/IP延迟发送数据