最近的项目要实现一台平板控制其余平板的功能(类即时通讯),主要用tcp或者udp进行开发,因为要保证一台机的命令要“发到”其余的机器上,我采取的是数据接收安全的TCP。思路如下图:
1.客户端负责发送与“接收”(其实不是服务端向客户端发送数据而是客户端自己在服务器读取),当然前提服务器提供URL与端口(PORT)。
2.难点:1,客户端与服务器断了能够重连(即当客户端断网了或者服务器崩了,客户端能显示此时断了并能够重连)即心跳感应
由客户端在一定的时间向服务器消息比如“ping”,服务器会在一定的时间内返回pong,如果在这段的时间内客户端没有接受到pong,则判定socket断了。这里我使用 了github上别人封装好的socket,并修改了一些东西。(本人是一级代码搬运工,擅长快速修改运用第三方代码,使之完美契合项目)。
附上链接: https://github.com/vilyever/AndroidSocketClient 主要是对里面的clientsocket类做了修改:
package utils;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.util.Log;
import android.widget.Toast;
import com.alibaba.fastjson.JSON;
import com.wyt.hcy.aiyixue_teacher.WelcomeActivity;
import Jsonbean.TeacherLoginRequest;
import application.App;
import contacts.Contacts;
import contacts.SendOrderBean;
import databse.DbUtils;
import socketclient.SocketClient;
import socketclient.helper.SocketClientDelegate;
import socketclient.helper.SocketClientReceivingDelegate;
import socketclient.helper.SocketClientSendingDelegate;
import socketclient.helper.SocketPacket;
import socketclient.helper.SocketPacketHelper;
import socketclient.helper.SocketResponsePacket;
import socketclient.util.CharsetUtil;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
/**
* TestClient
* Created by vilyever on 2016/7/26.
* Feature:
*/
public class ClientSocket {
public interface IsConnectedListener {
void sendMes(SocketClient client);
}
private IsConnectedListener listener;
public void setListener(IsConnectedListener listener) {
this.listener = listener;
}
private Context context;
public ClientSocket(Context context) {
this.context = context;
}
final ClientSocket self = this;
public void connect() {
self.getLocalSocketClient().connect();
}
private SocketClient localSocketClient;
public SocketClient getLocalSocketClient() {
if (this.localSocketClient == null) {
this.localSocketClient = new SocketClient();
__i__setupAddress(this.localSocketClient);
__i__setupEncoding(this.localSocketClient);
__i__setupConstantHeartBeat(this.localSocketClient);
__i__setupReadByLengthForSender(this.localSocketClient);
__i__setupReadByLengthForReceiver(this.localSocketClient);
this.localSocketClient.registerSocketClientDelegate(new SocketClientDelegate() {
@Override
public void onConnected(SocketClient client) {
Toast.makeText(context, "服务器已连接", Toast.LENGTH_SHORT).show();
DbUtils dbUtils=DbUtils.getInstance(context);
String userno = dbUtils.getTeacher().getUserno();
TeacherLoginRequest teacherLoginRequest = new TeacherLoginRequest(userno);
SendOrderBean sendOrderBean = new SendOrderBean("teacherLoginRequest", JSON.toJSONString(teacherLoginRequest), System.currentTimeMillis() + "");
client.sendString(JSON.toJSONString(sendOrderBean));
if (listener != null) {
listener.sendMes(client);
}
}
@Override
public void onDisconnected(final SocketClient client) {
Toast.makeText(context, "服务器断开连接", Toast.LENGTH_SHORT).show();
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
client.connect();
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}
}.execu