XMPP协议Asmack实现文件传输的真正解决方法

Android即时通讯开发实战:使用asmack库 本文还有配套的精品资源,点击获取 简介:asmack-master.zip包含asmack库源代码,是专为Android平台即时通讯开发设计的库,特别是基于XMPP协议的应用。XMPP是一种开放标准的即时通讯协议,支持实时通信和数据交换。asmack库提供了一系列与XMPP服务器交互的API,简化了IM应用的实现,并涵盖了连接管理、会话管理、消息处理等关键功能。开发者通过集... 阅读详情

在使用Asmack的过程中,文件传输是阻碍我前行的一个极大的绊脚石。在翻遍了百度和Google的情况下,依然不得其解。而偶然的一个蓦然回首,我却解决了这个问题。所以,立此贴,一来为自己记录;而来希望能够帮到后来者。我希望自己能够做出一个像微信一样的即时通信,可以发送各种富媒体,接下来看我怎么做,实现文件传输。



第一点,版本问题。

Asmack是一个开源库,地址:https://github.com/Flowdalic/asmack,如大家所看到的一样,这个GitHub并不是完整的代码,你需要通过Grail去构建,而且现在的代码是4.0.3了,我反正不知道怎么用,网上查到的都是大家用的那个什么Cloudy版本的,大概是在2010年左右出的,所以和4.0.3有差距。我后来选择了http://asmack.freakempire.de/0.8.1.1/  ,对,就是0.8.1.1,。。我之所以要说明版本是因为,不同版本,变化挺大的,特别是4.XX和0.xx,相差非常大。


第二点,Jar还是源码

国内大多数都套用一个叫asmack-jse-buddycloud-2010.12.11.jar的jar包,然后所有的可查资料,贴子,基本和这个相关。但是,如果你需要深入了解Asmcack,我建议是选择源码。这也是我为什么要选择0.8.1.1的原因,版本低,一般而言相对简单,而且有源码,我们就可以打日志跟踪。


第三点,一步步教你如何使用Asmack传输文件。


1)平台初始化。

这是隔住我问题的所在,导致我怎么也查不到问题所在的地方。

你需要调用AndroidSmack进行平台的初始化。记住这是使用Asmack必须的一步。我们很容易忽略它。至于它做了什么,我现在可以告诉大家它用AppClassLoader加载了一些类,而触发执行这些类的静态代码。详细的过程和技术细节我后续会再开一个篇来讲解。因为那个技术还挺难的。

public class SanLiaoApplication extends Application {
	private List<Activity> activityList = new LinkedList<Activity>();
	private SmackAndroid smackAndroid;//必须在APP的Application类中初始化平台

	public void onCreate()
	{
		super.onCreate();
		//使用log4j开启日志系统
		LogConfigurator logConfigurator =new LogConfigurator();
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		 java.util.Date date=new java.util.Date();
		 String dateString=date.getYear()+"_"+(date.getMonth()+1)+"_"+date.getDate()+"_"+date.getHours()+"_"+date.getMinutes()+"_"+date.getSeconds();
	 
		String pathString=Environment.getExternalStorageDirectory()+
				File.separator+"sanliao"+File.separator+"logs"+File.separator+"sanliao"+dateString+".log";
		Log.d("EIM",pathString);
		logConfigurator.setFileName(pathString);
		logConfigurator.setRootLevel(Level.DEBUG	);
		logConfigurator.setLevel("org.apache", Level.ERROR);
		logConfigurator.setFilePattern("%d %t %-5p [%c{2}]-[%L] [%M] %m%n");
		logConfigurator.setMaxFileSize(1024*1024*5);
		logConfigurator.setImmediateFlush(true);
		logConfigurator.configure();
		Logger logger =Logger.getLogger(EimApplication.class);
		logger.info("EIM APP is created info");
		logger.debug("EIM APP is creatd debug");
		logger.error("EIM APP is create error");
		smackAndroid=SmackAndroid.init(getApplicationContext());//初始化Asmack平台,必须的,否则会导致后续传输文件中出现iterm not find (404)错误。
		
		XMPPConnection.DEBUG_ENABLED=true;
	
		logger.debug("XMPPConnectionDebug enable");
	 
	}
	
	// 添加Activity到容器中
	public void addActivity(Activity activity) {
		activityList.add(activity);
	}

	// 遍历所有Activity并finish
	public void exit() {
		XmppConnectionManager.getInstance().disconnect();
		smackAndroid.onDestroy();
		for (Activity activity : activityList) {
			activity.finish();
		}
	}
}

上述代码其实主要包含三个部分:1)初始化log4j日志系统;2)初始化Asmack平台;3)将Activity都放到一个list,这个主要是为了管理Activity,在退出等处理上可以用到。


2)初始化FileTransferManager

这一步其实在网上大家都能够查到。但是我有必要提醒的是,至少0.8.1.1版本中,网上的代码通常会让你根本跑步起来。

先看代码。

	//if you need transport  file . you need call this method after connect and login
	public   boolean   initFileTransport()
	{
		if(connection==null)
		{
			return false;
		}
		else if(fileTransferManager!=null)
		{
			return true;
		}
		else
		{
			//fileTransferManager = new FileTransferManager(connection);//网上的放在这里,这回导致Asmack崩溃
			ServiceDiscoveryManager sdManager= ServiceDiscoveryManager.getInstanceFor(connection);
			if(sdManager==null)
			{
				sdManager=new ServiceDiscoveryManager(connection);
			}
			sdManager.addFeature("http://jabber.org/protocol/disco#info");
			sdManager.addFeature("jabber:iq:privacy");
			FileTransferNegotiator.setServiceEnabled(connection, true);
			 fileTransferManager = new FileTransferManager(connection);//在0.8.1.1版本(之后应该也是如此),正确的应该是放在这里。
			
	 
				return true;
		}
	}

我把初始化都封装到一个函数里面。需要提醒三点:

(1)上面代码里面的顺序和网上的一般不同,希望大家注意;

(2),我把fileTransferManager 当做XMPPConnection的一个成员。我之所以这么改是因为connection是全局的,你可以在你的其他全局(至少生命期和APP基本是同步)的,而不是该XMPPConnect的代码。所以,这是设计问题。

(3)这个函数的调用要在login登入之后调用。

为了给大家一个完整的上下文,我这里还是巨细无比的给出登入的代码。

// 登录
	private Integer login() {
		String username = loginConfig.getUsername();
		String password = loginConfig.getPassword();
		Log.d(LOG_TAG, "login now");
		try {
			XMPPConnection connection = XmppConnectionManager.getInstance().getConnection();
			Log.d(LOG_TAG,"login c2");
			logger.debug("XMPPConnection create ");
			connection.connect();
			logger.debug("XMPPConnection connected ");
			Log.d(LOG_TAG,"login c3");
			logger.debug("username:"+username+",passwd:"+password);
			connection.login(username, password); // 登录
			logger.debug("XMPPConnection logined ");
			//init the file transport   can not put it here
			XmppConnectionManager.getInstance().initFileTransport();//文件传输管理的初始化
		 
			// OfflineMsgManager.getInstance(activitySupport).dealOfflineMsg(connection);//处理离线消息
			connection.sendPacket(new Presence(Presence.Type.available));
			Log.d(LOG_TAG, "login c5");
			if (loginConfig.isNovisible()) {// 隐身登录
				Presence presence = new Presence(Presence.Type.unavailable);
				Collection<RosterEntry> rosters = connection.getRoster()
						.getEntries();
				for (RosterEntry rosterEntry : rosters) {
					presence.setTo(rosterEntry.getUser());
					connection.sendPacket(presence);
				}
			}
			loginConfig.setUsername(username);
			if (loginConfig.isRemember()) {// 保存密码
				loginConfig.setPassword(password);
			} else {
				loginConfig.setPassword("");
			}
			loginConfig.setOnline(true);
			
			return Constant.LOGIN_SECCESS;
		} catch (Exception xee) {
			Log.d(LOG_TAG,xee.toString() );
			if (xee instanceof XMPPException) {
				XMPPException xe = (XMPPException) xee;
				Log.d(LOG_TAG,xe.toString() );
				final XMPPError error = xe.getXMPPError();
			 
				int errorCode = 0;
				if (error != null) {
					errorCode = error.getCode();
	 
				}
				if (errorCode == 401) {
					return Constant.LOGIN_ERROR_ACCOUNT_PASS;
				}else if (errorCode == 403) {
					return Constant.LOGIN_ERROR_ACCOUNT_PASS;
				} else {
					return Constant.SERVER_UNAVAILABLE;
				}
			} else {
				return Constant.LOGIN_ERROR;
			}
		}
	}

到这里,初始化工作算是告一段落。现在,接下来就是要实现如何传输了。

3)发送方。

发送图片为例子。



如上图所示,我们希望的是点击“图片”的时候,我们就可以选择图片,选择完图片后,就可以把图片发送出去。相信,这就是我们需要的,毕竟这就是和微信一样的。

首先“图片”控件需要响应点击。

///////transport image button
			tupianBtn = (ImageButton)getActivity().findViewById(R.id.imageButton_tupian);
			tupianBtn.setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					 Toast.makeText(getActivity(), "send file",  Toast.LENGTH_SHORT).show();
					 Intent intent=new Intent();
					 intent.setType("image/*");//选择图片,这个采用系统的意图。
					intent.setAction(Intent.ACTION_GET_CONTENT);
					startActivityForResult(intent, TUPIAN_RESULT);//选择完之后,会回到本Activity来。
				 
				}
			});
选择完图片后,会回到Activity,所以,我们如下处理。
public void onActivityResult(int requestCode, int resultCode,Intent data) {
		if(requestCode==TUPIAN_RESULT)
		{
			Uri uri=data.getData();
			String[] proj={MediaStore.Images.Media.DATA};
			Cursor cursor=getActivity().managedQuery(uri,proj,null,null,null);
			int index=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
			cursor.moveToFirst();
			String img_path=cursor.getString(index);
			Log.d("FragMultiFunc","img_path:"+img_path);
			String toId=((AChatActivity)getActivity()).getTo();
			new SendFileTask().execute(img_path,toId);//图片路径和我要向谁发送。
			
		}
	}

对,开一个AsynCTask来发送图片,给任务传输两个参数,图片文件的路径和我要向谁发送。接着,我给大家看这个SendFileTask的所有代码。

public class SendFileTask extends AsyncTask<String, Integer, Integer>{
	private final static Logger logger=Logger.getLogger(SendFileTask.class);
	private final static String TAG="SendFileTask";
	@Override
	protected Integer doInBackground(String... params) {
		// TODO Auto-generated method stub
	       if  (params.length < 2) {
	    	   Log.d(TAG,"parameter invalide");
               return Integer.valueOf(-1);
          }
	       String img_path=params[0];
	       String toId=params[1]+"/Smack";
	       Log.d(TAG,"img_path:"+img_path);
	       logger.debug("img_path:"+img_path);
	     
	     //  XmppConnectionManager.getInstance().initFileTransport();
	       FileTransferManager fileTransferManager=XmppConnectionManager.getInstance().getFileTransferManager();//获取文件传输管理对象(它被我写成XMPPConnect里面了)
	       if(fileTransferManager==null)
	       {
	    	   Log.d(TAG, "get FileTransferManager failed");
	    	   return -1 ;
	       }
	       File filetosend= new File(img_path);
	       if(filetosend.exists()==false)
	       {
	    	   Log.d(TAG,"file:"+img_path+" is  not exist");
	    	   return -1;
	       }
	       Log.d(TAG,"to user:"+toId);
	       OutgoingFileTransfer oft=fileTransferManager.createOutgoingFileTransfer(toId);//创建一个输出文件传输对象
	       try {
			oft.sendFile(filetosend, "recv img");
			/////
			  while(!oft.isDone())
		       {
		    	   if (oft.getStatus().equals(FileTransfer.Status.error))
	               {
	                   Log.e(TAG, "send failed");
	               }
	               else
	               {
	                   Log.i(TAG, "status:" + oft.getStatus() + "|progress:" +  oft.getProgress());//打印进度
	               }
		    	   try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		       }
		} catch (XMPPException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
 
          return 0;
          
	}
}
上述代码是在一个AsyncTask来发送我们的文件,同时每隔1秒打印下进度。(后续可以传递给UI来显示)

这就是发送端。

那么接受端呢?

4)接收方

对于接收方,我在看网上的代码的时候,我最为痛苦的是,接收方的代码放在哪里。而不是接收方代码本身如何写。有人把它当做一个服务,毕竟接受是属于“listener”,我试过,至少我没有成功的跑起来。或许是因为我当时没有进行平台初始化,不过这都不管了。我就告诉我能行的方法。我觉得当你选择一个好友进行对话的时候,就可以监听。

所以,我在和好友的对话ChatActivity一开始,我就设置文件监听。在Oncreate中调用如下init函数。

	public void init()
	{
		FragChatTitle fragChatTitle = new FragChatTitle();  
        getFragmentManager().beginTransaction().replace(R.id.chat_title_layout,fragChatTitle).commit();  
        FragChatHistory fragChatHistory=new FragChatHistory();
       getFragmentManager().beginTransaction().replace(R.id.chat_history_layout,fragChatHistory).commit();  
        FragChatBottom fragChatBottom=new FragChatBottom();
        getFragmentManager().beginTransaction().replace(R.id.chat_bottom_layout,fragChatBottom).commit();  
        FragMultiFunc fragMultiFunc=new FragMultiFunc();
        getFragmentManager().beginTransaction().replace(R.id.chat_multifunc_layout,fragMultiFunc).hide(fragMultiFunc).commit();  
        
        
        ///add listener for file transport listener
        XMPPConnection connection = XmppConnectionManager.getInstance().getConnection();
        FileTransferManager manager = XmppConnectionManager.getInstance().getFileTransferManager();
      
        ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection);  
        if (sdm == null)  
            sdm = new ServiceDiscoveryManager(connection);  
        sdm.addFeature("http://jabber.org/protocol/disco#info");  
        sdm.addFeature("jabber:iq:privacy");  
        // Create the file transfer manager  
 
        FileTransferNegotiator.setServiceEnabled(connection, true);  
        
        
        manager.addFileTransferListener(new FileTransferListener() {
		@Override
		public void fileTransferRequest(final FileTransferRequest request) {
			Log.d("NewChatActivity","recv file");
			// TODO Auto-generated method stub
            new Thread(){
                @Override
                public void run() {
                   IncomingFileTransfer transfer = request.accept();
                   Log.d(LOG_TAG,"file_name:"+transfer.getFileName());
                   File mf = Environment.getExternalStorageDirectory();
                 String save_path=  Environment.getExternalStorageDirectory()+File.separator+"Eim"+File.separator+transfer.getFileName();
                   File file = new File(save_path);
                   try{
                       transfer.recieveFile(file);
                       while(!transfer.isDone()) {
                          try{
                             Thread.sleep(1000L);
                          }catch (Exception e) {
                             Log.e("NewChat", e.getMessage());
                          }
                          if(transfer.getStatus().equals(Status.error)) {
                             Log.e("ERROR!!! ", transfer.getError() +"");
                          }
                          if(transfer.getException() != null) {
                             transfer.getException().printStackTrace();
                          }
                       }
                    }catch (Exception e) {
                       Log.e("NewChatActivit", e.getMessage());
                   }
                };
              }.start();
		}
         });
        
	}

这个函数会被Activity的Oncreate调用。这样,完整的Asmack文件传输就可以跑起来了。成功传输文件。。。

如果有什么问题,可以问我。







Asmack 4.0.7安卓即时通讯库完整解决方案(含源码+API文档) 某些防火墙会过滤非业务流量,此时可伪装为状态更新:@Overridetry {// 45秒一次注意事项:频率不宜过高,避免增加服务器负载。建议结合监听网络切换事件动态启停心跳。在Doze模式下,应依赖或执行周期任务。XMPP定义了五种基本Presence类型:类型含义是否显示为在线available默认上线状态✅明确下线❌away暂离⚠️(标记为离开)chat可交谈✅(鼓励发起对话) 阅读详情

相关推荐

android IM

android 实现 xmpp协议,基于asmack包,能登陆gtalk服务器的简单例子 即时通讯相关的资料: android asmack 注册 登陆 聊天 多人聊天室 文件传输 http://www.cnblogs.com/not-code/archive/2011/07/16/2108369.html 成功解决asmack不能收发文件的问题 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=81207 asmack :http://code.google.com/p/asmack/downloads/list 用androidpn来实现推送:http://www.iteye.com/topic/1117043 AndroidPN环境建立 :http://www.cnblogs.com/devxiaobai/archive/2011/07/09/2101794.html smack 源码分析一(android上实现长连接) http://wangqinghua123.iteye.com/blog/1341355 http://www.push-notification.mobi/get_api_key.php android smack源码分析——接收消息以及如何解析消息: http://www.cnblogs.com/not-code/archive/2011/08/01/2124340.html MTQQ http://www.cnblogs.com/charley_yang/archive/2011/03/27/1997938.html http://javatech.blog.163.com/blog/static/1766322992010111725339587/ http://www.cnblogs.com/charley_yang/archive/2011/03/27/1997058.html http://www.cnblogs.com/charley_yang/archive/2011/03/27/1997049.html http://wangdan.info/?p=169

Android asmack使用介绍

Android asmack使用介绍 文章最后附上Demo地址 一、简介 1.什么是Xmpp协议? XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的,最早是在Jabber上实现的。它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具

dhj1987822的博客 1898

android手机间smack传输文件

花了两天时间,成功解决xmpp协议smack间传文件的问题。保证能正常传输。

android xmpp文件传输,XMPP通讯开发-好友文件传输

在XMPP通讯开发-好友通信实现中我们实现了好友间的信息通信,在这里我们实现好友间文件的传输,这部分内容可以查看smack_3_3_0\documentation\extensions\index.html,文件传输我们主要用到的是FileTransferManager和OutgoingFileTransfer,当然我们可以发送文件也可以接收文件,要实现接收文件我们需要FileTransferM...

weixin_28703451的博客 231

asmack(实现文件传输)

asmack 是实现安卓系统即时通讯的一个开源项目,可以实现发送文字消息等功能,但不能直接实现文件传输。本次上传的是经过修改asmack源码后可以实现文件传输的版本。

xmpp socket5 文件传输

基于Asmack库 xmpp 协议 socket5 文件传输

XMPP协议和asmack

更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boot 实战(干货) React 入门实战(干货) 构建中小型互联网企业架构(干货) python 学习持续更新 ElasticSearch 笔记 kafka storm 实战 (干货) ...

架构师的成长之路的博客 558

asmack支持文件传输

asmack支持文件传输

XMPP系列(五)---文件传输

xmpp中发送文件和接收文件的处理有些不太一样,接收文件处理比较简单,发送稍微复杂一些。 首先需要在XMPPFramework.h中添加文件传输类 //文件传输 //接收文件 #import "XMPPIncomingFileTransfer.h" //发送文件 #import "XMPPOutgoingFileTransfer.h" 1、文件接收 文件的接收是被动的,所以需要在X...

weixin_30596343的博客 279

asmack.jar修改版,修复传文件的negotiating stream问题

修改版的asmack,支持android客户端收发文件。解决negotiating stream 阻塞问题。

实战指南:从零搭建ROS2 + Cartographer 2D激光SLAM系统

本文详细介绍了如何从零开始搭建ROS2与Cartographer结合的2D激光SLAM系统,涵盖环境准备、激光雷达驱动配置、Cartographer安装与参数调优等关键步骤。通过实战案例和常见问题解决方案,帮助开发者快速掌握激光雷达建图技术,提升机器人自主导航能力。

weixin_29062255的博客 403

帮助你快速理解openfire是什么

1.openfire是什么? openfire是一个即时通讯服务器,也称之为即时通讯平台。它是基于XMPP协议的,大家所熟悉的通讯软件QQ、MSN和Gtalk等等,其中Gtalk就是基于XMPP协议的实现。 在即时通讯中往往因为需要保存一些状态或者数据所以不能采用点对点通讯,而是需要搭建服务器来转发。 下载地址:http://www.igniterealtime.org/downloads/

qin的专栏 3677

AI变现案例实战系列4:AI数字员工团队——用OpenClaw搭建6个智能体,自动运营你的赚钱系统

摘要:谷歌AI产品经理Shubham Saboo利用OpenClaw搭建6人AI团队,实现内容创作、技术开发等任务自动化,每月成本不足400美元。文章对比阿里云和Windows本地两种部署方案,提供详细配置指南。通过多Agent架构实现物理隔离与精准协作,可创建6个专业AI角色(如研究员、运营、工程师等),每个Agent专注单一任务,避免记忆负担和上下文污染问题。阿里云方案适合长期稳定运行,Windows本地部署则适合零成本测试。最终可组建高效AI团队,实现7x24小时无人值守运营。(149字)

小明的博客 1141

Xmpp协议 OpenFire服务器 Asmack Android客户端 一些Bug的解决方法

分享互联网,转载请注明出处。 最近需要做一些有关即时通讯的项目,花了几天时间搜集了一下有关即时通讯方面的资料 最终选定Openfire做为服务器,Asmack 作为Android端的实现。 1.只能发 不能收 如果按照API上写的去做,直接在new 与某个用户的Chat 之后 addListener,结果就是只能发不能收。 按照下面这样写,可以解决。 ChatMan

宋煦的Android开发专栏 3549

Chapter 19 Digital Phase-Locked Loops

数字锁相环 Digital Phase-Locked Loops, 就是根据原来时钟信号, 产生新的时钟信号, which is locked or synchronized. (align 参考时钟边沿 or 在中间)

2304_76736886的博客 973

U8备份提示“远程组件初始化失败”

问题现象: SQL出现问题后重装,U8没有重装,之后直接附加数据库,U8可以正常登陆,但是在备份的时候提示远程组件初始化失败。 问题原因: 因为重装了SQL,没有进行U8数据源初始化,导致Master库中丢失了存储过程储 解决办法:在Master库重建存储过程 USE [master] GO SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER OFF GO CREATE PROCEDURE [dbo].[U8FileServerExtendProc] @cmdLi.

SamYux 2474

从Json.NET到System.Text.Json:迁移避坑指南+共存方案(附对比清单)

**Json.NET**(Newtonsoft.Json)是 .NET 生态中使用最广的高性能 JSON 序列化框架,而 .NET 5+ 官方内置的 **System.Text.Json** 正在成为新的默认选择。本文面向新手开发者,用最通俗的方式讲清:从 **Json.NET 迁移到 System.Text.Json** 时最容易踩的 7 个坑、两套 JSON 库如何优雅**共存**,以及一份可

gitblog_01181的博客 483

安卓APP通过CH340实现USB串口通信与设备检测

本文详细介绍了安卓APP通过CH340芯片实现USB串口通信与设备检测的完整流程。从CH340芯片的基础原理到开发环境搭建,再到串口通信的具体实现和错误处理,提供了全面的技术指导。文章还分享了USB热插拔处理、自动重连策略以及性能优化等实战技巧,帮助开发者高效完成安卓与嵌入式设备的通信开发。

weixin_42531925的博客 380

android即时通讯技术基于XMPP协议asmack聊天功能实战

XMPP协议简介 XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的,最早是在Jabber上实现的。它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。并且XML很易穿过防火墙,所以用XMPP构建的应用不易受到防火墙的阻碍。利用XMPP作...

专注移动开发 469

ORB-SLAM2算法部署验证、原理代码和各种改进方法汇总

本文主要汇总个人学习使用ORB-SLAM2算法中参考的相关博客和代码汇总,以及在ORB-SLAM2算法基础上各个改进方法的汇总。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 745

【Go语言实战】(9) gRPC 实现一个简单微服务

文章目录写在前面1. 安装1.1 grpc1.2 proto1.3 protobuf2. 编写代码2.1 初始化项目2.2 编写proto2.3 编写服务端2.4 实现客户端3. 演示 写在前面 这一次我们用gRPC实现获取用户的信息 1. 安装 1.1 grpc grpc的安装直接go get即可 go get google.golang.org/grpc 1.2 proto 下载proto,我是下载这个的。 然后解压出来把bin目录放在直接放在系统变量当中 1.3 protobuf 我们在

面向生活编程 3272

android asmack基于xmpp的即时通讯应用

xmpp是一个通信协议。因为这是个开放的协议,为了节俭开发成本,很多即时应用都采用了这个协议。Android上最常用的组合asmack +openfire。Asmack是smack的android版,是对xmpp协议进行了封装,并提供了丰富的api,简化了操作。Openfire是一个开源的IM服务器,基于Xmpp实现。换句话说使用xmpp开发即时通讯应用的话,服务器端已经开发好了,就是openfi

383

大数据ZooKeeper(一):ZooKeeper基本知识

Zookeeper是一个分布式协调服务的开源框架。主要用来解决分布式集群中应用系统的一致性问题。ZooKeeper本质上是一个。

Lansonli(蓝深李)的博客 3150

Android之基于XMPP协议即时通讯软件(一)

文章开头,先打一下广告咯,今年误打误撞,侥幸进入2013优快云博客之星候选,目前排名已经有点不堪入目,所以,谨希望广大基友们动动手指,轻轻的点击两下,给我投出宝贵的一票,求宣传,求扩散,非常感谢,感激涕零,总之是语无伦次的感谢!!! 投票地址请移驾:http://vote.blog.csdn.net/blogstaritem/blogstar2013/weidi1989 好了,进入正

way 4万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android asmack 注册 登陆 聊天 多人聊天室 文件传输

XMPP协议简介 XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的,最早是在Jabber上实现的。它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。并且XML很易穿过防火墙,所以用XMPP构建的应用不易受到防火墙的阻碍。利用XMPP作

u014593566的专栏 318

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

android asmack 注册 登陆 聊天 多人聊天室 文件传输XMPP协议简介

android asmack 注册 登陆 聊天 多人聊天室 文件传输XMPP协议简介XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的,最早是在Jabber上实现的。它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。并且XML很易穿过防火

Alexzhang369学习总结空间 1700

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: Java4Android之BlockingQueue
下一篇: Java4Android之静态相关
minimicall
博客等级 码龄18年 407粉丝 174原创
评论 19
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值