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. Cobar + MySQL 技术验证(li)

    一.简介 Cobar是一个对数据进行拆分后进行分布式存储的产品,可以支持使用后台的 MySQL或者Oracle数据库,通过配置,将数据按照一定规则存储入不同的数据库中.即用分布式数据库代替了集中式数据 ...

  2. 《连载 | 物联网框架ServerSuperIO教程》- 10.持续传输大块数据流的两种方式(如:文件)

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  3. 每天一个设计模式-3 适配器模式(Adapteer)

    每天一个设计模式-3 适配器模式(Adapteer) 1.现实中的情况 旧式电脑的硬盘是串口的,直接与硬盘连接,新硬盘是并口的,显然新硬盘不能直接连在电脑上,于是就有了转接线.好了,今天的学习主题出来 ...

  4. css小技巧(1)

    1.-webkit-overflow-scrolling: touch; 解决ios滑动时无缓冲问题 2.::-webkit-scrollbar 设置ios滑动时是否显示滚动条 3.::selecti ...

  5. nginx启动、关闭、重启

    1.启动 [root@localhost local]# nginx/sbin/nginx #启动 [root@localhost local]# nginx/sbin/nginx -t #检查配置文 ...

  6. 拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc

    不久前发布了一篇博文".NET轻量级RPC框架:Rabbit.Rpc",当初只实现了非常简单的功能,也罗列了之后的计划,经过几天的不断努力又为Rabbit.Rpc增加了一大波新特性 ...

  7. Perforce 与Source Insight, Visual Studio集成

    转自:http://shashanzhao.com/archives/837.html 1.Perforce 首先需要为perforce设置系统环境变量,以便perforce命令行可以正常使用. 环境 ...

  8. CentOS yum 源的配置与使用

    一.yum 简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的 ...

  9. win 7下建立FTP

    1.安装FTP服务 鼠标桌面右击个性化-卸载程序-打开或关闭windows功能 2.在IIS控制面板里添加FTP站点 下一步 下一步 鼠标右击 下一步 下一步 3.配置ftp站点 4.测试站点是否正常 ...

  10. 解决mybatis foreach 错误: Parameter '__frch_item_0' not found

    解决mybatis foreach 错误: Parameter '__frch_item_0' not found 在遍历对象的属性(是ArrayList对象)时报错: org.mybatis.spr ...