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. mongodb在java中的查询

    mongodb 根据_id 查询记录: public Price queryPriceById(String id) throws Exception { return mongoTemplate.f ...

  2. CSS3之过渡及2D变换

    transition过渡 transition-duration:; 运动时间 transition-delay:; 延迟时间 transition-timing-function:; 运动形式 ea ...

  3. AlloyTouch与three.js 3D模型交互

    如你所见,上面的cube的旋转.加速.减速停止都是通过AlloyTouch去实现的. 演示 代码 <script src="asset/three.js"></s ...

  4. 利用github pages创建简单的网站

    github.com 作为最流行的源代码管理工具已经风靡全球,同时在依托于github也衍生出了各种各样的应用,比如可以利用github搭建博客系统等等. 先换个话题,我们每人手头都或多或少有些&qu ...

  5. 记录下UIButton的图文妙用和子控件的优先显示

    UIButton的用处特别多,这里只记录下把按钮应用在图文显示的场景,和需要把图片作为按钮的背景图片显示场景: 另外记录下在父控件的子控件优先显示方法(控件置于最前面和置于最后面). 先上效果图: 1 ...

  6. Oracle发送邮件,支持HTML,多收件人,多附件

    Oracle发邮件,权限问题 - 创建 ACL BEGIN DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl => 'email_server_permissions. ...

  7. SQL优化 查询语句中,用 inner join 作为过滤条件和用where作为过滤条件的区别

    前段时间遇到一个存储过程,参数之一是一个字符串,在存储过程中,把字符串拆分成一个临时表之后存为一个key值的临时表,作为其中一个查询条件, 逻辑实现上有两种处理方式 insert into #t se ...

  8. 微软本月将推Win10 望打破Win8所带来差评影响

    系统妈 据香港“文汇报”7月15日报道,美国电脑巨擘微软13日宣布,新视窗系统10(Windows 10)将于7月29日推出.微软高层迈赫迪在网志表示,届时全球将有13个城市举办特别活动,表扬参与Wi ...

  9. 最实用的IT类网站及工具大集合

    1.聚合数据 大家在开发过程中,可能会用到各种各样的数据,想找一些接口来提供一些数据.比如天气预报查询,火车时刻表查询,彩票查询,身份证查询等等.有了这个接口,直接调用即可.各种各样的API接口满足你 ...

  10. Django 前后台的数据传递

    Django 从后台往前台传递数据时有多种方法可以实现. 最简单的后台是这样的: from django.shortcuts import render def main_page(request): ...