java版简易socket客户端
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;
}
}
}
}
java版简易socket客户端的更多相关文章
- java版Web Socket,实现消息推送
# web socket是什么? WebSocket协议是基于TCP的一种新的网络协议. 它实现了浏览器与服务器全双工(full-duplex)通信,允许服务器主动发送信息给客户端. ## 用途 实时 ...
- 【Java】简易Socket连接实现
客户端: import java.io.*; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.D ...
- Java版简易画图板的实现
Windows的画图板相信很多人都用过,这次我们就来讲讲Java版本的简易画板的实现. 基本的思路是这样的:画板实现大致分三部分:一是画板界面的实现,二是画板的监听以及画图的实现,三是画板的重绘.(文 ...
- java版ftp简易客户端(可以获取文件的名称及文件大小)
java版ftp简易客户端(可以获取文件的名称及文件大小) package com.ccb.ftp; import java.io.IOException; import java.net.Socke ...
- java.net.SocketException:Software caused connection abort: recv failed 异常分析 +socket客户端&服务端代码
java.net.SocketException:Software caused connection abort: recv failed 异常分析 分类: 很多的技术 2012-01-04 12: ...
- APP自动化框架-ATX原理解析及JAVA版客户端
作为网易开源的ATX APP自动化测试框架,对比现有的macaca自动化框架/Appium自动化框架,最大的特别就是在于可远程进行自动化测试 先给大家看一张我自己梳理的框架架构图 框架巧妙点: 1. ...
- Java中使用Socket连接判断Inputstream结束,java tcp socket服务端,python tcp socket客户端
最近在试着用java写一个socket的服务器,用python写一个socket的客户端来完成二者之间的通信,但是发现存在一个问题,服务器方面就卡在读取inputsream的地方不动了,导致后面的代码 ...
- java版gRPC实战之四:客户端流
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- java版gRPC实战之六:客户端动态获取服务端地址
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
随机推荐
- MySQL引擎、索引和优化(li)
一.存储引擎 存储引擎,MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术 ...
- Regular Express正则表达式基础
一. 创建一个正则表达式RegExp,有两种方式如下图所示 二. 创建一个正则表达式RegExp详述说明 1.构造函数 //RegExp 是js中一个内置的对象,是正则表达式的缩写 var reg = ...
- SharePoint 2013 沙盒解决方案不能激活(激活按钮不可用)
把沙盒解决方案上传到目标站点的"解决方案"库中,发现"激活"按钮是灰掉的,不可用. 首先,我想到的是权限不足,所以 "以管理员身份"启动IE ...
- linux安装中文语言包
相关配置如下: yum install fonts-chinese.noarch yum install m17n-db-common-cjk yum install m17n-db-chinese安 ...
- Android中的Libraries以及Order and Export的使用。
1Add JAR 从Eclipse的现有所有工程中,添加jar包到该工程下 2Add External JARs 从Eclipse外的其他的位置,添加jar包到该工程下 3Add Variable 增 ...
- Ubuntu搭建NFS
NFS全称是Network File System,网络文件系统.它可以通过网络实现文件共享.其结构图大概是这样的: 在机器E上开启NFS服务,机器ABCD都挂载NFS,这样可以实现机器ABCD共享文 ...
- Myeclipse怎么连接MySQL数据库?
1.打开 >> Myeclipse 2.Window >> Open Perspective >> Myeclipse Database Explore ...
- Oracle学习笔记八 表空间
表空间 表空间是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间 . 分区表 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下 ...
- 《HeadFirst SQL》笔记
规范化 0 约束 1 原子性 2 第一范式 1NF 3 数据模式 4 依赖 5 联接查询 6 交叉联接(AKA 笛卡尔联接,叉积) 7 内联接 8 子查询 9 外联接 10 自联接 11 集合 12 ...
- 运行Maven工程总是报错:No goals have been specified for this build
Error info: No goals have been specified for this build. You must specify a valid lifecycle phase or ...