最近的项目要实现一台平板控制其余平板的功能(类即时通讯),主要用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;
                        }
               
                
Android TCP Socket 实现监控及Walkman服务器通信
        
                  
                  
                  
                  
本文介绍了如何使用Android实现TCP Socket通信,确保数据的安全接收。通过心跳机制实现客户端与服务器的断线重连。文章中提到了对第三方库AndroidSocketClient的修改,用于处理数据包的包头和包尾,以及与PHP端Walkman服务器的数据格式约定。当客户端间通信出现问题时,服务器会保存未送达的消息,待客户端重新连接后发送。同时提供了处理Walkman接收数据开头乱码的解决方案和一个使用本地广播接收消息的工具类。
          
最低0.47元/天 解锁文章
                          
                      
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
              
            
                  
					4478
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
            


            