android项目需要使用到心跳, 于是编写了一个简易的socket客户端程序

主要功能是给服务端发送心跳包,保持在线状态

没有使用框架,这样避免了需要引入包,直接使用的阻塞Socket通信。

主要逻辑如下

public class TCPConnector implements Connector {
private final byte[] PACK_LENGTH = new byte[4]; private String host;
private int port;
private Socket client;
private TCPConnectNotify connectNotify;
private boolean needWork; public TCPConnector(String host, int port, TCPConnectNotify connectNotify){
this.host = host;
this.port = port;
this.connectNotify = connectNotify;
this.needWork = true;
} //@Override
public void connect() {
try {
client = new Socket(host, port);
client.setKeepAlive(true);
} catch (IOException e) {
e.printStackTrace();
closeConnect();
connectNotify.connectFailed();
return;
} if (!client.isConnected()) {
connectNotify.connectFailed();
return;
}
connectNotify.connectSuccess(); work();
} //@Override
public void send(Object object) {
if (needWork) {
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream oout = new CompactObjectOutputStream(byteArrayOutputStream);
oout.writeObject(object);
oout.flush();
oout.close(); int size = byteArrayOutputStream.size();
byte[] array = ByteBuffer.allocate(4).putInt(size).array(); ByteArrayOutputStream pack = new ByteArrayOutputStream();
pack.write(array);
pack.write(byteArrayOutputStream.toByteArray()); OutputStream outputStream = client.getOutputStream();
outputStream.write(pack.toByteArray()); } catch (IOException e) {
e.printStackTrace();
closeConnect();
}
}
} //@Override
public void close() {
//needWork = false;
closeConnect();
} private void work() {
while (needWork) {
//printStatue();
checkConnect();
checkReceiveMsg();
sleepMills(10000);
}
} void checkConnect() {
if (client == null
|| !client.isConnected()
|| client.isInputShutdown()
|| client.isOutputShutdown()) {
connect();
}
} void checkReceiveMsg() {
try {
DataInputStream dataInputStream = getDataStream();
int num = dataInputStream.available();
if (num > 0)
System.out.println("服务端返回长度:" + num);
if (num > 4) { dataInputStream.read(PACK_LENGTH); String s = Hex2StringHelper.hexString(PACK_LENGTH);
System.out.println(s); ObjectInputStream objectInputStream = new CompactObjectInputStream(
dataInputStream, new ClassLoaderClassResolver(this.getClass().getClassLoader()));
Object object = objectInputStream.readObject();
connectNotify.newMessageSuccess(object);
}
} catch (Exception e) {
e.printStackTrace();
connectNotify.newMessageFailed();
closeConnect();
}
} void sleepMills(int mills) {
try {
TimeUnit.MILLISECONDS.sleep(mills);
} catch (InterruptedException e) {
e.printStackTrace();
}
} DataInputStream getDataStream() {
DataInputStream dataInputStream = null;
try {
dataInputStream = new DataInputStream(client.getInputStream());
} catch (IOException e) {
e.printStackTrace();
closeConnect();
} finally {
return dataInputStream;
}
} void closeConnect() {
if (client != null) {
try {
client.shutdownOutput();
client.close();
} catch (IOException e1) {
e1.printStackTrace();
} finally {
client = null;
}
}
}
}

具体代码simple-socket-demo

java版简易socket客户端的更多相关文章

  1. java版Web Socket,实现消息推送

    # web socket是什么? WebSocket协议是基于TCP的一种新的网络协议. 它实现了浏览器与服务器全双工(full-duplex)通信,允许服务器主动发送信息给客户端. ## 用途 实时 ...

  2. 【Java】简易Socket连接实现

    客户端: import java.io.*; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.D ...

  3. Java版简易画图板的实现

    Windows的画图板相信很多人都用过,这次我们就来讲讲Java版本的简易画板的实现. 基本的思路是这样的:画板实现大致分三部分:一是画板界面的实现,二是画板的监听以及画图的实现,三是画板的重绘.(文 ...

  4. java版ftp简易客户端(可以获取文件的名称及文件大小)

    java版ftp简易客户端(可以获取文件的名称及文件大小) package com.ccb.ftp; import java.io.IOException; import java.net.Socke ...

  5. java.net.SocketException:Software caused connection abort: recv failed 异常分析 +socket客户端&服务端代码

    java.net.SocketException:Software caused connection abort: recv failed 异常分析 分类: 很多的技术 2012-01-04 12: ...

  6. APP自动化框架-ATX原理解析及JAVA版客户端

    作为网易开源的ATX APP自动化测试框架,对比现有的macaca自动化框架/Appium自动化框架,最大的特别就是在于可远程进行自动化测试 先给大家看一张我自己梳理的框架架构图 框架巧妙点: 1. ...

  7. Java中使用Socket连接判断Inputstream结束,java tcp socket服务端,python tcp socket客户端

    最近在试着用java写一个socket的服务器,用python写一个socket的客户端来完成二者之间的通信,但是发现存在一个问题,服务器方面就卡在读取inputsream的地方不动了,导致后面的代码 ...

  8. java版gRPC实战之四:客户端流

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. java版gRPC实战之六:客户端动态获取服务端地址

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

随机推荐

  1. SPI 2分频MOSI实现

    module spi_25M(input clk,input rst_n,output reg sdin,output reg sclk,output reg cs);reg [7:0]cnt;reg ...

  2. 计算(LnN!)的值

    import java.util.*;import java.math.*;public class CaculatorLnN { public static void main(String[] a ...

  3. python入门-python解释器执行

    最近由于公司需要,接触了python这门神奇的语言,给我的感觉就是开发快速和代码简洁. 开始还是先罗列一下解释性语言和编译性语言的差别吧0.0!   编译性语言:是在程序运行前,需要专门的一个编译过程 ...

  4. css3 linear-gradient实现购物车地址选择信封效果

    对于css3的渐变前端的童鞋一定不陌生,在一些电商网站会为了美化将地址选择做成信封样式(个人感觉很稀饭~),看了一下它的实现方式,大多数是以图片的形式,持着优化的心态尝试着用css3 linear-g ...

  5. iOS - ViewController的生命周期

    iOS SDK中提供很多原生的ViewController,大大提高了我们的开发效率:那么下面我们就根据开发中我们常用的ViewController谈一谈它的生命周期: (一)按照结构和用法可以对iO ...

  6. 简历生成平台项目开发-STEP4第二次项目例会讨论

    时间:2016.7.15周五7点半 地点:图书馆 讨论主题:交流各自手头项目进展,确定下一步任务 内容:按照之前的讨论的任务大家各自汇报进度. 汇报人:谭卓.尹忠诚 内容:1.基于富文本编辑器的模板, ...

  7. JS控制键盘录入 和 window.event.keycode对照

    一.只允许录入整数 1.不允许录入非数字(按下字母键就会提示并清空) function intOnly() { if (!(window.event.keyCode >= 48 &&am ...

  8. WPF SpreadSheetGear电子表单

    我们经常会碰到生成Excel 界面并在其上操作的功能开发. 比如如下界面,我们需要在菜单里添加一个菜单按钮"Columns To Rows Transform" 功能是对多列批量转 ...

  9. Android Studio NDK 开发 问题记录

    Android NDK 开发 问题解决 编译:找不到gles3库 使用旧的编译方式,写Android.mk 进行编译.报错如下 gles3/gl3.h no such file or director ...

  10. web前端(实习生)之“百度二面”

    2016.3.18,星期五.我经历了我的第一次面试. 在面完一面之后,面试官说“我对你的考核到这里结束了,我去看一下公司是决定现在就安排二面还是只有再做安排,你先在这里等一下.”我当时就蒙圈了:一是在 ...