亲宝软件园·资讯

展开

java实现即时通信 java实现即时通信的完整步骤分享

氵何章怀晓 。 人气:0
想了解java实现即时通信的完整步骤讲解的相关内容吗,氵何章怀晓 。在本文为您仔细讲解java实现即时通信的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:java,即时通信,java即时通信源码,java即时通信程序,下面大家一起来学习吧。

前言

移动社交是我们日常生活中很常见的软件,最近在做即时通信,我用的是环信,和大家分享一下~~
环信的API都是基于JSON的,所以在构造HTTP请求的时候,要指定请求头


注意==》环信API必须携带token才可以访问。

创建一个认证类

	public class Authentic {

 private static Token token = new Token();

 private TalkHttpService service;

 public Authentic(TalkHttpService service) {
 this.service = service;
 }

 public Authentic(TalkHttpService service, Token token) {
 this.service = service;
 if (token != null) {
  Authentic.token = token;
 }
 }

 public Token getToken() {
 this.flush();
 return token;
 }

 public void task() {
 this.flush();
 }

 /**
 * @describe 申请认证 POST PUT 这两种请求携带参数
 * @author 何章怀晓 hezhanghuaixiao
 * @date 2020/9/8 17:02
 * @other
 */
 public void applyAuthentication(HttpEntityEnclosingRequestBase request) {
 this.flush();
 request.addHeader("Authorization", "Bearer " + token.toString());
 }
 /**
 * @describe 申请认证 GET DELETE 这两种请求不携带参数
 * @author 何章怀晓 hezhanghuaixiao
 * @date 2020/9/8 17:02
 * @other
 */
 public void applyAuthentication(HttpRequestBase request) {
 this.flush();
 request.addHeader("Authorization", "Bearer " + token.toString());
 }

 private void flush() {
 synchronized (Authentic.class) {
  try {
  //如果超时
  if (token.isExpire()) {
   //判断APPID和秘钥信息
   if (_Global.APP_CLIENT_ID != null && _Global.APP_CLIENT_SECRET != null) {
   Map<String, Object> param = new HashMap<String, Object>();
   param.put("grant_type", "client_credentials");
   param.put("client_id", _Global.APP_CLIENT_ID);
   param.put("client_secret", _Global.APP_CLIENT_SECRET);
   //请求获取token
   TalkNode res = service
    .request(_Global.URR_TOKEN, _Global.HTTP_METHOD_POST, param, null, null);
   //成功获取token
   if (res != null && res.getAccess_token() != null && res.getExpires_in() != null
    && res.getExpires_in() > 0) {
    //赋值
    token = new Token(res.getAccess_token(),
     res.getExpires_in() * 1000 + System.currentTimeMillis());
   }
   }
  }
  } catch (Exception e) {
  e.printStackTrace();
  }
 }
 }

 public static class Token {

 private String token;
 private Long expire;

 public Token() {
 }

 public Token(String token, long expire) {
  this.token = token;
  this.expire = expire;
 }

 public String getToken() {
  return token;
 }

 public void setToken(String token) {
  this.token = token;
 }

 public Long getExpire() {
  return expire;
 }

 public void setExpire(Long expire) {
  this.expire = expire;
 }

 public boolean isExpire() {
  return expire == null || System.currentTimeMillis() > expire;
 }

 @Override
 public String toString() {
  return token;
 }
 }
}

创建请求接口

public interface TalkHttpService {
	/**
	 @describe
	 @param
		* @param url 请求地址

	 * @param method	请求方法

	 * @param param	参数

	 * @param auth	加密认证

	 * @param field	字段转换
	 @return com.hedashi.protal.model.TalkNode
	 @author 何章怀晓 hezhanghuaixiao
	 @date 2020/9/8 17:21
	 @other
	 */
	 TalkNode request(String url, int method, Object param,
  Authentic auth, String[][] field) throws Exception;

	/**
	 @describe
	 @param
		* @param url 请求地址

	 * @param file	文件名称

	 * @param auth	加密认证

	 * @param equal	字段转换
	 @return com.hedashi.protal.model.TalkNode
	 @author 何章怀晓 hezhanghuaixiao
	 @date 2020/9/8 17:21
	 @other
	 */
	 TalkNode upload(String url, File file, Authentic auth,
  String[][] equal) throws Exception;


	/**
	 @describe
	 @param
		* @param url 请求地址

	 * @param file	文件名称

	 * @param auth	加密认证

	 * @param header	请求头
	 @return void
	 @author 何章怀晓 hezhanghuaixiao
	 @date 2020/9/8 17:21
	 @other
	 */
	 void downLoad(String url, File file, Authentic auth,
  Map<String, String> header) throws Exception;

}

创建全局变量对不同模块操作

/*
 @describe 全局变量
 @params
 @return 
 @author 何章怀晓
 @date 2020/7/30 9:30
 @other
 */
public class _Global {
	
	public static String APP_KEY = "";
	public static String APP_CLIENT_ID = "";
	public static String APP_CLIENT_SECRET = "";
	//每页数量
	public static int APP_PAGE_SIZE = 10;
	public static final int HTTP_METHOD_GET = 1;
	public static final int HTTP_METHOD_POST = 2;
	public static final int HTTP_METHOD_PUT = 3;
	public static final int HTTP_METHOD_DELETE = 4;
	public static final String URL_HOST = "http://a1.easemob.com/"+APP_KEY.replace("#","/")+"/";
	public static final String URR_TOKEN = URL_HOST+"token";
	public static final String URL_CHAT = URL_HOST+"chatmessages";
	public static final String URL_GROUP = URL_HOST+"chatgroups";
	public static final String URL_FILE = URL_HOST+"chatfiles";
	public static final String URL_ROOM = URL_HOST+"chatrooms";
	public static final String URL_MESSAGES = URL_HOST+"messages";
	public static final String URL_USER = URL_HOST+"users";
	
}

请求管理类

package com.hedashi.protal.service.impl;


import com.hedashi.protal.model.TalkNode;
import com.hedashi.protal.model.Authentic;
import com.hedashi.protal.service.TalkHttpService;
import com.hedashi.protal.util.JsonTool;
import com.hedashi.protal.util._Global;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URI;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Service;

@Service
public class TalkHttpServiceImplApache implements TalkHttpService {
 /**
 @describe
 @param
 * @param url 请求路径

 * @param method 方式

 * @param param 参数

 * @param auth 认证

 * @param field 将相应结果封装到本地
 @return com.hedashi.protal.model.TalkNode
 @author 何章怀晓 hezhanghuaixiao
 @date 2020/9/8 17:39
 @other
 */
 @Override
 public TalkNode request(String url, int method, Object param,
  Authentic auth, String[][] field) throws Exception {

 //获得可关闭的连接
 CloseableHttpClient client = this.getClient();
 try {
  HttpResponse response = null;
  //区分请求方式
  switch (method) {
  case _Global.HTTP_METHOD_GET:
   //构建请求
   HttpGet get = new HttpGet(url);
   if (auth != null) {
   //如果未认证 请求认证
   auth.applyAuthentication(get);
   }
   //固定请求头信息为JSON
   get.addHeader("Content-Type", "application/json");
   response = client.execute(get);
   break;
  case _Global.HTTP_METHOD_POST:
   HttpPost post = new HttpPost(url);
   if (auth != null) {
   auth.applyAuthentication(post);
   }
   //POST携带参数
   if (param != null) {
   //参数编码放入请求体
   post.setEntity(new StringEntity(JsonTool.write(param),
    "UTF-8"));
   }
   post.addHeader("Content-Type", "application/json");
   response = client.execute(post);
   break;
  case _Global.HTTP_METHOD_PUT:
   HttpPut put = new HttpPut(url);
   if (put != null) {
   auth.applyAuthentication(put);
   }
   if (param != null) {
   put.setEntity(new StringEntity(JsonTool.write(param),
    "UTF-8"));
   }
   put.addHeader("Content-Type", "application/json");
   response = client.execute(put);
   break;
  case _Global.HTTP_METHOD_DELETE:
   HttpDelete delete = new HttpDelete(url);
   if (auth != null) {
   auth.applyAuthentication(delete);
   }
   delete.addHeader("Content-Type", "application/json");
   response = client.execute(delete);
   break;
  default:
   throw new Exception("非法请求方式");
  }
  int code = response.getStatusLine().getStatusCode();
  //判断返回code 如果为200
  if (code == HttpStatus.SC_OK) {
  //获取响应体
  HttpEntity entity = response.getEntity();
  if (entity != null) {
   //解析
   String json = EntityUtils.toString(entity, "UTF-8");
   if (field != null && field.length > 0) {
   for (String[] temp : field) {
    json = json.replace(temp[0], temp[1]);
   }
   }
   //解析为实体类
   TalkNode talkNode = (TalkNode) JsonTool.read(json, TalkNode.class);
   talkNode.setStatusCode(code);
   return talkNode;
  }
  } else {
  //非200将code返回
  return new TalkNode(code);
  }
 } catch (Exception e) {
  throw e;
 } finally {
  client.close();
 }
 return null;
 }

 @Override
 public TalkNode upload(String url, File file, Authentic auth,
  String[][] equal) throws Exception {
 CloseableHttpClient client = this.getClient();
 try {
  HttpPost post = new HttpPost();
  post.setURI(new URI(url));
  if (auth != null) {
  auth.applyAuthentication(post);
  }
  post.addHeader("restrict-access", "true");
  ContentBody body = new FileBody(file);
  MultipartEntity part = new MultipartEntity();
  part.addPart("file", body);
  post.setEntity(part);
  HttpResponse response = client.execute(post);
  int code = response.getStatusLine().getStatusCode();
  if (code == HttpStatus.SC_OK) {
  HttpEntity entity = response.getEntity();
  if (entity != null) {
   String json = EntityUtils.toString(entity, "UTF-8");
   if (equal != null && equal.length > 0) {
   for (String[] temp : equal) {
    json = json.replace(temp[0], temp[1]);
   }
   }

   TalkNode talkNode = (TalkNode) JsonTool.read(json, TalkNode.class);
   talkNode.setStatusCode(code);
   return talkNode;
  }
  }
 } catch (Exception e) {
  throw e;
 } finally {
  client.close();
 }
 return null;
 }

 @Override
 public void downLoad(String url, File file, Authentic auth,
  Map<String, String> header) throws Exception {
 CloseableHttpClient client = this.getClient();
 try {
  HttpGet get = new HttpGet();
  get.setURI(new URI(url));
  if (auth != null) {
  auth.applyAuthentication(get);
  }
  for (Entry<String, String> en : header.entrySet()) {
  get.addHeader(en.getKey(), en.getValue());
  }
  HttpResponse response = client.execute(get);
  if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
  HttpEntity entity = response.getEntity();
  if (entity != null) {
   InputStream in = entity.getContent();
   FileOutputStream fos = new FileOutputStream(file);
   byte[] data = new byte[10 * 1024];
   int len = 0;
   while ((len = in.read(data)) != -1) {
   fos.write(data, 0, len);
   }
   fos.flush();
   fos.close();
   in.close();
  }
  }
 } catch (Exception e) {
  throw e;
 } finally {
  client.close();
 }
 }

 private CloseableHttpClient getClient() {
 return HttpClients.createDefault();
 }
}

创建业务请求和响应格式类

package com.hedashi.protal.model;

import java.util.List;
import java.util.Map;
/**
 @describe 根据不同的业务封装不同的返回结果,该格式在发送请求的时候就被指定
 @author 何章怀晓 hezhanghuaixiao
 @date 2020/9/8 17:42
 @other
 */
public class TalkNode {

 public static final String[][] DATA_ENTITIES = new String[][]{{"entities", "entities_share"},
  {"share-secret", "share_secret"}};
 public static final String[][] DATA_ARRAY = new String[][]{{"data", "data_array"}};
 public static final String[][] DATA_LIST = new String[][]{{"data", "data_list"}};
 public static final String[][] DATA_MAP = new String[][]{{"data", "data_map"}};
 public static final String[][] DATA_CHAT_LIST = new String[][]{{"entities", "data_chat_list"}};
 public static final String[][] DATA_ROOM = new String[][]{{"data", "data_room"}};
 public static final String[][] DATA_ROOM_LIST = new String[][]{{"data", "data_room_list"},
  {"public", "public_room"}};
 public static final String[][] DATA_ROOM_REDO = new String[][]{{"data", "data_room_rodo"}};
 public static final String[][] DATA_ROOM_REDO_LIST = new String[][]{
  {"data", "data_room_redo_list"}};
 public static final String[][] DATA_GROUP = new String[][]{{"data", "data_group"}};
 public static final String[][] DATA_GROUP_UPDATE = new String[][]{{"data", "data_group_update"}};
 public static final String[][] DATA_GROUP_OWNER = new String[][]{{"data", "data_group_owner"}};
 public static final String[][] DATA_GROUP_LIST = new String[][]{{"data", "data_group_list"}};
 public static final String[][] DATA_GROUP_LIST_MEMBER = new String[][]{
  {"data", "data_group_list_member"}};
 public static final String[][] DATA_GROUP_LIST_NEW = new String[][]{
  {"data", "data_group_list_new"}, {"public", "public_group"}};
 public static final String[][] DATA_GROUP_FRIEND = new String[][]{{"data", "data_group_friend"}};
 public static final String[][] DATA_GROUP_FRIEND_LIST = new String[][]{
  {"data", "data_group_friend_list"}};
 private String access_token;
 private String action;
 private String application;
 private String applicationName;
 private Long count;
 private String cursor;
 private Integer duration;
 private Long expires_in;
 private String organization;
 private String path;
 private Integer statusCode;
 private Long timestamp;
 private String uri;
 private Map<String, Object> params;
 private TalkUser user;
 private List<TalkUser> entities;
 private String[] data_array;
 private Map<String, String> data_map;
 private List<Map<String, Object>> data_list;
 private List<TalkMsg> data_chat_list;
 private TalkRoom data_room;
 private List<TalkRoom> data_room_list;
 private TalkRoomRedo data_room_rodo;
 private List<TalkRoomRedo> data_room_redo_list;
 private TalkGroup data_group;
 private TalkGroupMember data_group_update;
 private TalkGroupMember data_group_owner;
 private List<TalkGroup> data_group_list;
 private List<TalkGroupMember> data_group_list_member;
 private List<TalkGroupNew> data_group_list_new;
 private TalkGroupFriend data_group_friend;
 private List<TalkGroupFriend> data_group_friend_list;

 public TalkNode() {
 }


 public TalkNode(Integer statusCode) {
 this.statusCode = statusCode;
 }

 public String getAccess_token() {
 return access_token;
 }

 public void setAccess_token(String access_token) {
 this.access_token = access_token;
 }

 public String getAction() {
 return action;
 }

 public void setAction(String action) {
 this.action = action;
 }

 public String getApplication() {
 return application;
 }

 public void setApplication(String application) {
 this.application = application;
 }

 public String getApplicationName() {
 return applicationName;
 }

 public void setApplicationName(String applicationName) {
 this.applicationName = applicationName;
 }

 public Long getCount() {
 return count;
 }

 public void setCount(Long count) {
 this.count = count;
 }

 public String getCursor() {
 return cursor;
 }

 public void setCursor(String cursor) {
 this.cursor = cursor;
 }

 public Integer getDuration() {
 return duration;
 }

 public void setDuration(Integer duration) {
 this.duration = duration;
 }

 public Long getExpires_in() {
 return expires_in;
 }

 public void setExpires_in(Long expires_in) {
 this.expires_in = expires_in;
 }

 public String getOrganization() {
 return organization;
 }

 public void setOrganization(String organization) {
 this.organization = organization;
 }

 public String getPath() {
 return path;
 }

 public void setPath(String path) {
 this.path = path;
 }

 public Integer getStatusCode() {
 return statusCode;
 }

 public void setStatusCode(Integer statusCode) {
 this.statusCode = statusCode;
 }

 public Long getTimestamp() {
 return timestamp;
 }

 public void setTimestamp(Long timestamp) {
 this.timestamp = timestamp;
 }

 public String getUri() {
 return uri;
 }

 public void setUri(String uri) {
 this.uri = uri;
 }

 public Map<String, Object> getParams() {
 return params;
 }

 public void setParams(Map<String, Object> params) {
 this.params = params;
 }

 public TalkUser getUser() {
 return user;
 }

 public void setUser(TalkUser user) {
 this.user = user;
 }

 public List<TalkUser> getEntities() {
 return entities;
 }

 public void setEntities(List<TalkUser> entities) {
 this.entities = entities;
 }

 public String[] getData_array() {
 return data_array;
 }

 public void setData_array(String[] data_array) {
 this.data_array = data_array;
 }

 public Map<String, String> getData_map() {
 return data_map;
 }

 public void setData_map(Map<String, String> data_map) {
 this.data_map = data_map;
 }

 public List<Map<String, Object>> getData_list() {
 return data_list;
 }

 public void setData_list(List<Map<String, Object>> data_list) {
 this.data_list = data_list;
 }

 public List<TalkMsg> getData_chat_list() {
 return data_chat_list;
 }

 public void setData_chat_list(List<TalkMsg> data_chat_list) {
 this.data_chat_list = data_chat_list;
 }

 public TalkRoom getData_room() {
 return data_room;
 }

 public void setData_room(TalkRoom data_room) {
 this.data_room = data_room;
 }

 public List<TalkRoom> getData_room_list() {
 return data_room_list;
 }

 public void setData_room_list(List<TalkRoom> data_room_list) {
 this.data_room_list = data_room_list;
 }

 public TalkRoomRedo getData_room_rodo() {
 return data_room_rodo;
 }

 public void setData_room_rodo(TalkRoomRedo data_room_rodo) {
 this.data_room_rodo = data_room_rodo;
 }

 public List<TalkRoomRedo> getData_room_redo_list() {
 return data_room_redo_list;
 }

 public void setData_room_redo_list(List<TalkRoomRedo> data_room_redo_list) {
 this.data_room_redo_list = data_room_redo_list;
 }

 public TalkGroup getData_group() {
 return data_group;
 }

 public void setData_group(TalkGroup data_group) {
 this.data_group = data_group;
 }

 public TalkGroupMember getData_group_update() {
 return data_group_update;
 }

 public void setData_group_update(TalkGroupMember data_group_update) {
 this.data_group_update = data_group_update;
 }

 public TalkGroupMember getData_group_owner() {
 return data_group_owner;
 }

 public void setData_group_owner(TalkGroupMember data_group_owner) {
 this.data_group_owner = data_group_owner;
 }

 public List<TalkGroup> getData_group_list() {
 return data_group_list;
 }

 public void setData_group_list(List<TalkGroup> data_group_list) {
 this.data_group_list = data_group_list;
 }

 public List<TalkGroupMember> getData_group_list_member() {
 return data_group_list_member;
 }

 public void setData_group_list_member(
  List<TalkGroupMember> data_group_list_member) {
 this.data_group_list_member = data_group_list_member;
 }

 public List<TalkGroupNew> getData_group_list_new() {
 return data_group_list_new;
 }

 public void setData_group_list_new(List<TalkGroupNew> data_group_list_new) {
 this.data_group_list_new = data_group_list_new;
 }

 public TalkGroupFriend getData_group_friend() {
 return data_group_friend;
 }

 public void setData_group_friend(TalkGroupFriend data_group_friend) {
 this.data_group_friend = data_group_friend;
 }

 public List<TalkGroupFriend> getData_group_friend_list() {
 return data_group_friend_list;
 }

 public void setData_group_friend_list(
  List<TalkGroupFriend> data_group_friend_list) {
 this.data_group_friend_list = data_group_friend_list;
 }
}

工具类

public class HuanXinUtil {

	private static TalkDataService service = null;

	/**
	 @describe 初始化
	 @param
		* @param
	 @return void
	 @author 何章怀晓 hezhanghuaixiao
	 @date 2020/9/8 17:26
	 @other
	 */
	private static void init(){

		if(service == null){
			
			// 初始服务端Token
			Authentic.Token token = new Authentic(new TalkHttpServiceImplApache()).getToken();
			//token和过期时间
			Authentic.Token TEST_TOKEN = new Authentic.Token(token.getToken(),token.getExpire());
			//新建一个链接服务
			service = new TalkDataServiceImpl(new TalkHttpServiceImplApache());
			// 修改数据业务Token
			service.setToken(TEST_TOKEN);
		}
	}

	/**
		 @describe 添加管理员
		 @param
		 * @param groupId 群组id

		 * @param userid 管理员id
		 @return boolean
		 @author 何章怀晓 hezhanghuaixiao
		 @date 2020/9/8 17:54
		 @other
		 */
	public static boolean addGroupManager(String groupId,String userid) {
		try {
			init();
			TalkNode talkNode = service.addGroupManager(groupId,userid);
			if(talkNode.getStatusCode()==200){
				return true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
	}

service调用

 @Override
 public TalkNode addGroupManager(String id, String userId) throws Exception {
 Map<String, Object> param = new HashMap<String, Object>();
 param.put("newadmin", userId);
 return service.request(_Global.URL_GROUP + "/" + id + "/admin",
  _Global.HTTP_METHOD_POST, param, auth, TalkNode.DATA_GROUP);
 }
 /**
 * @param [groupId, managerId]
 * @return com.hedashi.common.api.CommonResult
 * @describe 后台添加群组管理员
 * @author 何章怀晓 hezhanghuaixiao
 * @date 2020/9/8 14:28
 * @other
 */
 @Override
 public CommonResult addGroupManager(String groupId, String managerId) {
 boolean b = HuanXinUtil.addGroupManager(groupId, managerId);
 if(b){
  System.out.println("环信添加管理员成功==========================");
  //本地添加管理员
  addGroupAdmin(groupId,managerId);
  return CommonResult.success("SUCCESS");
 }
 return CommonResult.failed("FAILED");
 }
 @ApiOperation(value = "群组添加管理员")
 @RequestMapping(value = "/addGroupManager", method = RequestMethod.POST)
 @ResponseBody
 public CommonResult<HeAdmin> addGroupManager(
  @RequestParam @ApiParam(value = "群组环信ID", required = true) String groupId,
  @RequestParam @ApiParam(value = "管理员环信id", required = true) String managerId
 ) {
 return heUGroupService.addGroupManager(groupId,managerId);
 }

swagger调用

token 信息

{“application”:“53e3eeb5-6926-46dd-bc61-4e214342ef7e”,“access_token”:“YWMtXDS-uPG6EeqItFktBQxljAAAAAAAAAAAAAAAAAAAAAFT4-61aSZG3bxhTiFDQu9-AgMAAAF0bSppWwBPGgBXDkgrlvguBLEe966D_LnbgNyNz2OOsTgP4okhQGoOdA”,“expires_in”:5184000}

swagger返回结果

控制台


数据库:

总结

加载全部内容

相关教程
猜你喜欢
用户评论