首页 技术 正文
技术 2022年11月16日
0 收藏 493 点赞 3,815 浏览 2723 个字

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,991
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,505
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,349
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,134
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,766
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,844