抑郁症健康,内容丰富有趣,生活中的好帮手!
抑郁症健康 > Android Socket连接(模拟心跳包 断线重连 发送数据等)

Android Socket连接(模拟心跳包 断线重连 发送数据等)

时间:2019-03-04 12:53:55

相关推荐

首页博客学院下载GitChatTinyMind论坛问答商城VIP活动招聘ITeyeCSTO写博客发Chat

喻志强的博客

耐心 细心 用心 传播正能量

RSS订阅原

Android Socket连接(模拟心跳包,断线重连,发送数据等)
置顶09月26日 14:29:13阅读数:2040

这两天做了一个项目是app通过socket连接自动炒菜机,给炒菜机发指令,炒菜机接收到指令会执行相应的操作。(程序虽然做的差不多了,然而我连炒菜机长什么样都没见过)

其实作为一个会做饭的程序猿,我坚信还是自己动手做的饭菜比较好吃,毕竟做饭还是很有趣的。

闲话不多说,因为是通过socket去连接炒菜机的,并且要求每两秒要给炒菜机发送一个指令,点击按钮的话也要发送相应的指令。

所以要考虑一些问题,比如断线重连,数据发送失败了重连,要保持全局只有一个连接等等。

因为是要保证全局只能有一个连接,而且我们还需要在不同的Activity中发指令,因此肯定不能在需要发指令的界面中都去连接socket,这样一来不好管理,性能也不好,重复代码也会比较多,所以想了一下还是把socket放到service中比较好,发指令功能都放在service中即可。

记得要先给网络权限

<uses-permission android:name="android.permission.INTERNET" />

1

下面我们来看看Service中的代码,其中有些细节是需要注意的

1)我们要保证只有一个连接服务运行,所以在启动服务之前先判断一下连接服务是否正在运行,如果正在运行,就不再启动服务了。

2)连接成功之后给出相应的通知,告诉连接者连接成功了,方便进行下一步操作,这里为了省事儿就直接用EventBus去通知了。也可以用广播的方式去通知。

3)连接超时之后要注意先释放调之前的资源,然后重新初始化

package com.yzq.socketdemo.service;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.Handler;import android.os.IBinder;import android.os.Looper;import android.util.Log;import android.widget.TabHost;import android.widget.Toast;import com.mon.Constants;import com.mon.EventMsg;import org.greenrobot.eventbus.EventBus;import java.io.IOException;import java.io.OutputStream;import .ConnectException;import .InetSocketAddress;import .NoRouteToHostException;import .Socket;import .SocketTimeoutException;import java.util.Timer;import java.util.TimerTask;/*** Created by yzq on /9/26.* <p>* socket连接服务*/public class SocketService extends Service {/*socket*/private Socket socket;/*连接线程*/private Thread connectThread;private Timer timer = new Timer();private OutputStream outputStream;private SocketBinder sockerBinder = new SocketBinder();private String ip;private String port;private TimerTask task;/*默认重连*/private boolean isReConnect = true;private Handler handler = new Handler(Looper.getMainLooper());@Overridepublic IBinder onBind(Intent intent) {return sockerBinder;}public class SocketBinder extends Binder {/*返回SocketService 在需要的地方可以通过ServiceConnection获取到SocketService */public SocketService getService() {return SocketService.this;}}@Overridepublic void onCreate() {super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {/*拿到传递过来的ip和端口号*/ip = intent.getStringExtra(Constants.INTENT_IP);port = intent.getStringExtra(Constants.INTENT_PORT);/*初始化socket*/initSocket();return super.onStartCommand(intent, flags, startId);}/*初始化socket*/private void initSocket() {if (socket == null && connectThread == null) {connectThread = new Thread(new Runnable() {@Overridepublic void run() {socket = new Socket();try {/*超时时间为2秒*/socket.connect(new InetSocketAddress(ip, Integer.valueOf(port)), 2000);/*连接成功的话 发送心跳包*/if (socket.isConnected()) {/*因为Toast是要运行在主线程的 这里是子线程 所以需要到主线程哪里去显示toast*/toastMsg("socket已连接");/*发送连接成功的消息*/EventMsg msg = new EventMsg();msg.setTag(Constants.CONNET_SUCCESS);EventBus.getDefault().post(msg);/*发送心跳数据*/sendBeatData();}} catch (IOException e) {e.printStackTrace();if (e instanceof SocketTimeoutException) {toastMsg("连接超时,正在重连");releaseSocket();} else if (e instanceof NoRouteToHostException) {toastMsg("该地址不存在,请检查");stopSelf();} else if (e instanceof ConnectException) {toastMsg("连接异常或被拒绝,请检查");stopSelf();}}}});/*启动连接线程*/connectThread.start();}}/*因为Toast是要运行在主线程的 所以需要到主线程哪里去显示toast*/private void toastMsg(final String msg) {handler.post(new Runnable() {@Overridepublic void run() {Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();}});}/*发送数据*/public void sendOrder(final String order) {if (socket != null && socket.isConnected()) {/*发送指令*/new Thread(new Runnable() {@Overridepublic void run() {try {outputStream = socket.getOutputStream();if (outputStream != null) {outputStream.write((order).getBytes("gbk"));outputStream.flush();}} catch (IOException e) {e.printStackTrace();}}}).start();} else {toastMsg("socket连接错误,请重试");}}/*定时发送数据*/private void sendBeatData() {if (timer == null) {timer = new Timer();}if (task == null) {task = new TimerTask() {@Overridepublic void run() {try {outputStream = socket.getOutputStream();/*这里的编码方式根据你的需求去改*/outputStream.write(("test").getBytes("gbk"));outputStream.flush();} catch (Exception e) {/*发送失败说明socket断开了或者出现了其他错误*/toastMsg("连接断开,正在重连");/*重连*/releaseSocket();e.printStackTrace();}}};}timer.schedule(task, 0, 2000);}/*释放资源*/private void releaseSocket() {if (task != null) {task.cancel();task = null;}if (timer != null) {timer.purge();timer.cancel();timer = null;}if (outputStream != null) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}outputStream = null;}if (socket != null) {try {socket.close();} catch (IOException e) {}socket = null;}if (connectThread != null) {connectThread = null;}/*重新初始化socket*/if (isReConnect) {initSocket();}}@Overridepublic void onDestroy() {super.onDestroy();Log.i("SocketService", "onDestroy");isReConnect = false;releaseSocket();}}

12345678910111213141516171819222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119111221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992000220320420520620720820921021121221321421521621721821921222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272

好了,连接的service我们基本就做好了,先来看看效果,调试工具使用的是一个网络调试助手,免去我们写服务端的代码。

来看看效果图:

可以看到,断线重连,连接成功自动发送数据,连接成功发消息这些都有了,实际上数据发送失败重连也是有的,不过模拟器上间隔时间很长,不知道怎么回事,真机没有问题。

解决了service下面就是Activity于service通信的问题了。这个就简单了,我们在service中提供了一个binder,我们可以通过binder来拿到service,然后调service的sendOrder()即可

先来看看示例代码:

package com.yzq.socketdemo.activity;import ponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.support.v7.app.AppCompatActivity;import android.widget.Button;import android.widget.EditText;import com.yzq.socketdemo.R;import com.yzq.socketdemo.service.SocketService;import butterknife.BindView;import butterknife.ButterKnife;import butterknife.OnClick;/*** Created by yzq on /9/26.* <p>* mainActivity*/public class MainActivity extends AppCompatActivity {@BindView(R.id.contentEt)EditText contentEt;@BindView(R.id.sendBtn)Button sendBtn;private ServiceConnection sc;public SocketService socketService;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindSocketService();ButterKnife.bind(this);}private void bindSocketService() {/*通过binder拿到service*/sc = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {SocketService.SocketBinder binder = (SocketService.SocketBinder) iBinder;socketService = binder.getService();}@Overridepublic void onServiceDisconnected(ComponentName componentName) {}};Intent intent = new Intent(getApplicationContext(), SocketService.class);bindService(intent, sc, BIND_AUTO_CREATE);}@OnClick(R.id.sendBtn)public void onViewClicked() {String data = contentEt.getText().toString().trim();socketService.sendOrder(data);}@Overrideprotected void onDestroy() {super.onDestroy();unbindService(sc);Intent intent = new Intent(getApplicationContext(), SocketService.class);stopService(intent);}}

1234567891011121314151617181922232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485

ok,大功告成

下面是demo,我用的是android studio3.0预览版,可能gradle版本会高一些。

socketDemo

版权声明:本文为博主原创文章,转载请注明地址。如果文中有什么纰漏或错误的话,请留言指正,我会及时修改。如果你觉得本文还不错的话,记得点个赞呦,希望能帮到你,谢谢。 /yuzhiqiang_1993/article/details/78094909文章标签:androidsocketsocketsocket断线重连个人分类:Android暴躁的码字猴-02-28 15:46:37#3楼请问 你家炒菜机上市没,我去买一个伤不起12-12-07 10:39:57#2楼能默默的问一个,怎么接收数据吗,我将inputstream用eventbus传到main界面,因为不停接收,会出现oom的查看回复(1)wwwzwb-10-15 22:45:13#1楼不错,图文并茂还有源码,再看不明白就只能去工地搬砖了!上一页1下一页

【android学习】断线重连机制

【解决问题】android端连接网络之后,当网络断开连接时,为了提高用户体验,android自动检测网络,当有网络时,用户无需进行多余操作,android端自动重新连接网络。 【解决方案】 1...

SunshineTan

-07-27 22:41:07

阅读数:7034

关于socket判断连接断开并重连

关于socket判断连接断开并重连 以下是个线程函数 UINT CMonitorDlg::ThreadFunction(LPVOID pParam) { WSADATA wsaData;SOCKET...

tengxiaoming

-08-27 01:02:00

阅读数:8423

android-socket斷開之後重新連接 - CSDN博客

最后,将SocketClient.resetSocket();放入图片中的catch{}中,捕获异常的时候重新...WebsocketSSL加密之android端(带重连) 最近在开发Android手机端的websocket通信...

-5-25

WebSocket安卓客户端实现详解(一)--连接建立与重连- CSDN博客

WebSocket安卓客户端实现详解(一)–连接建立与重连今年在公司第一个需求就是...android中使用webSocket通信 概述最近公司项目准备使用WebSocket实现消息推送功能,在...

-3-2

您有一张免费的北京车展门票等待领取美好购车节 · 顶新

WebSocket安卓客户端实现详解(一)--连接建立与重连

今年在公司第一个需求就是基于websocket写一个客户端消息中心,现在已经上线很久了在司机这种网络环境平均一天重连8次,自认为还是不错的.当时写的时候那个心酸啊,主要因为第一次写都不知道该从哪下手,...

zly921112

-06-10 00:07:03

阅读数:19672

Android:这是一份很详细的Socket使用攻略 - CSDN博客

前言Socket的使用在Android的网络编程中非常重要今天我将带大家全面了解Socket及其使用方法 目录1.网络基础1.1 计算机网络分层计算机网络分为五层:物理层、数据链路层...

-5-2

android端socket长连接 架构 - CSDN博客

看过包建强的《App研发录》之后对其中的基础Activity类封装感到惊讶,一直想找一种方式去解决关于app中使用socket长连接问题,如何实现简易的封装来达到主活动中涉及...

-5-28

AndroidSocket连接(心跳检测,断线重连,状态监测等)

09月27日13.06MB下载

android-socket斷開之後重新連接

今天研究这个问题搞了整整一天啊!终于出来了,不过我没有多大的成就感,为什么呢?因为这是我学长的劳动成果。同样的问题,我却没想出来!心塞的很啊…… 不过还是要给大家分享一下,希望给大家带来帮助! ...

yqj234

-04-27 10:24:49

阅读数:405

问题:解决Android中socket自动断开连接 - 酸豆角作坊 - CSDN博客

后来查找了资料,显示原来Android中蓝牙socket通信连接时长大概为120s,如果超过这个...• Android入门实战 •socket连接,判断连接中断,如果中断,并自动重连。 ...

-9-19

Android:这是一份很详细的Socket使用攻略 - CSDN博客

Socket的使用在Android网络编程中非常重要 今天我将带大家全面了解Socket及 其...Android:RxJava 结合 Retrofit 全面实现 网络请求出错重连Android:RxJava 结合...

-12-27

Socket长连接Android端心跳机制实现

前面用golang写的socket服务端请移步:/u010072711/article/details/760821761. 把socket链接和心跳功能都放在...

u010072711

-07-25 22:36:27

阅读数:7978

打印机出租,新机销售,选弘顺瑞通,绿色节能办公的首选!弘顺瑞通 · 顶新

Android中Socket使用 - CSDN博客

AndroidSocket用法详解 -11-08 16:5173人阅读评论(0)收藏举报 分类:android基础(28) 在客户/服务器通信模式中, 客户端需要...

-4-19

Android:最全面的Socket使用解析 - CSDN博客

版权声明:本文为博主原创文章,未经博主允许,更多文章请继续关注Carson_Ho的博客! 目录(?)[+] 前...

-5-23

Android-----借助MINA框架实现长连接、短连接以及断线重连

前面我们分析了MINA框架的源码,大家可以从这里进行查看,这篇博客我们使用MINA来完成项目中经常会用到的长连接、短连接、断线重连功能,直接开始了; MINA本身...

hzw19920329

-08-13 17:40:31

阅读数:6750

Android中判断socket通信断开

你好!这里是风筝的博客,欢迎和我一起交流。 如果本篇博客对您有帮助,或许可以在下方评论给我留个言呀。 可以引起网络连接关闭的情况有以下4种: 1. 直接调用Socket类的close方法...

Guet_Kite

-04-21 19:20:25

阅读数:4411

Android:这是一份很详细的Socket使用攻略 - CSDN博客

最后。该关闭的流和socket。是一定要关闭的。。。Socket的使用在Android网络编程中非常重要 今天我将带大家全面了解Socket及 其使用方法 目录 1...

-3-7

undefined

安卓 java有效判断Socket连接断开和安卓TCP测试APP(客户+服务端一体)

1. 利用socket提供的isConnected()与isClosed()方法来判断。但这种方式只是本地判断,只是本地操作connect()或close()方法后保存的一个状态,对于远程服务器主动断...

HelloMyPeople

-07-14 09:51:02

阅读数:5791

问题:解决Android中socket自动断开连接

连接上蓝牙模块后,能够正常读数,蓝牙数据发送速率为0.03s每个。大概在发送了342个数据之后,突然接收不到数据了。...

pursue16

-05-14 17:13:32

阅读数:2380

Androidsocket与服务器通信及心跳连接的实现

在项目中,有如下需求:Android客户端向服务器发送数据,收到服务器返回的数据发送成功标识后,客户端即与服务器建立数据一来一往的心跳连接,若服务器端断开时,客户端接收到通知,关闭Service停止发...

androidforwell

-02-14 17:19:48

阅读数:6071

androidsocket实现心跳包

//开一个新线程 new Thread(){ //用handle处理要发送的数据 Handler handler = new Handler(){ public voi...

mobei1983

-05-27 11:01:58

阅读数:594

Android的socket长连接(心跳检测)

03月23日2.78MB下载

Android心跳包(一)——心跳实现

长连接测试服务器:Socket基本上都这么一个流程。 public class Test { private static final int PORT = 1234; ...

github_27263697

-11-21 16:35:47

阅读数:441

在Android上面如何使用带有心跳检测的Socket

由于移动设备的网络的复杂性,经常会出现网络断开,如果没有心跳包的检测,客户端只会在需要发送数据的时候才知道自己已经断线,会延误,甚至丢失服务器发送过来的数据。一下简单建立一个带有心跳检测的Socket...

cuishiying

-08-12 00:45:53

阅读数:426

android长连接心跳机制

在写之前,我们首先了解一下为什么android维护长连接需要心跳机制,首先我们知道,维护任何一个长连接都需要心跳机制,客户端发送一个心跳给 服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器...

rabbit_in_android

-11-30 22:21:32

阅读数:19654

Android-socket的基本使用,发送文字和图片以及心跳

项目需求收集通过Socket向服务器发送图片,之前没搞过,网上搜搜写了下面的例子,勉强解决了需求。为了测试切换着方便,所以方法写的有点碎了。。。 原文地址 /...

qq_25806863

-07-20 15:55:20

阅读数:1611

Androidsocket通信的长连接与心跳检测

在Android开发中,我们可能需要和服务器保持连接不断开,这时需要用到socket通信的长连接,并且定时发送消息检测是否是连接状态——心跳检测。 我们需要一个客户端和一个服务器端的...

JJ583500596

-08-02 17:13:15

阅读数:1234

【Android】Android心跳包详解

在做IM通信时,都会遇到这样一个概念:心跳包。又是一个比较抽象的概念,那么心跳包到底是什么呢? 之前做的机房预定系统里,使用的Socket和服务器通信。长连接测试服务器:Socket基本上都这么...

bless

-09-27 14:04:08

阅读数:5026

Androidsocket通信长连接(心跳检测)

06月17日2.78MB下载

个人资料

yuzhiqiang_1993

关注原创56粉丝147喜欢195评论244等级:访问:19万+积分:2483排名:1万+勋章:

我的个人网站

我的个人网站

我的Github

最新文章

Android获取SHA1值的详细步骤从天地初开到MVC再到MVPrxjava2的相关封装Kotlin Unresolved reference: 解决办法Kotlin的变量和数据类型

博主专栏

从零开始,学习web前端

阅读量:8109621 篇

Kotlin从入门到放弃java

阅读量:4042 篇

归档

2月1篇1月3篇12月3篇10月5篇9月5篇8月1篇7月5篇6月3篇5月6篇4月4篇3月7篇2月3篇1月7篇11月1篇10月2篇8月1篇

展开

热门文章

超简单集成Android Zxing实现扫一扫二维码

阅读量:24982

Android 底部导航栏 BottomNavigationBar的简单使用

阅读量:15197

Android Studio3.x新的依赖方式(implementation、api、compileOnly)

阅读量:12346

Angular项目目录结构详解

阅读量:12136

Angular环境搭建

阅读量:10864

联系我们

请扫描二维码联系客服

webmaster@

400-660-0108

QQ客服客服论坛

关于招聘广告服务百度

©1999- CSDN版权所有

京ICP证09002463号

经营性网站备案信息

网络110报警服务

中国互联网举报中心

北京互联网违法和不良信息举报中心

2

收藏

评论

微信

微博

QQ关闭

如果觉得《Android Socket连接(模拟心跳包 断线重连 发送数据等)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。