当前位置:  编程技术>移动开发
本页文章导读:
    ▪项目开发中碰到的一个线程有关问题 (二)        项目开发中碰到的一个线程问题 (二)          前几天碰到了一个问题项目开发中碰到的一个线程问题(一),当时说的不太清楚 ,这里好好总结下。         现象:多线程Http.........
    ▪ uitableview 下提上拉刷新        uitableview 上提下拉刷新 #import <UIKit/UIKit.h> #import "PullToRefreshTableView.h" @interface ChyoViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>{ PullToRefreshTableView * tableView; NSMut.........
    ▪ 基于XMPP协议的手机多边多端即时通讯方案       基于XMPP协议的手机多方多端即时通讯方案 目   录 基于XMPP协议的手机多方多端即时通讯方案................................................................. 1 目   录........................................................

[1]项目开发中碰到的一个线程有关问题 (二)
    来源: 互联网  发布时间: 2014-02-18
项目开发中碰到的一个线程问题 (二)
         前几天碰到了一个问题项目开发中碰到的一个线程问题(一),当时说的不太清楚 ,这里好好总结下。
         现象:多线程Http请求,在服务端发现总会有相同参数的请求。当时认为是HttpClient在多线程下是线程非安全的,wangzhangxing 提到:
引用
PoolingClientConnectionManager cm = new PoolingClientConnectionManager();
cm.setMaxTotal(100);
然后new DefaultHttpClient(cm));
这样出来的client就是线程安全的了

         事实上代码里也确实是这么做的:
  /**
     * 初始化HttpClient对象
     * 
     * @return HttpClient对象
     */
    private HttpClient getHttpClient()
    {
        HttpClient httpClient = null;
        try
        {
            // ThreadSafeClientConnManager\PoolingClientConnectionManager
            PoolingClientConnectionManager pccm = new PoolingClientConnectionManager(getSchemeRegistry());
//            pccm.setDefaultMaxPerRoute(20);
            httpClient = new DefaultHttpClient(pccm, prepareHttpParams());
        }
        catch (Exception e)
        {
            e.printStackTrace();
            httpClient = new DefaultHttpClient();
        }
        return httpClient;
    }

        自己又认真狠看了几遍代码,其中的调用顺序是这样的,DataServiceImpl 是具体的业务实现类,通过HttpHelper对象获取服务端的信息。
package org.okura.timer;

/**
 * 服务接口实现类
 * 
 * @author okura
 * @since 2012-10-10
 */
public class DataServiceImpl implements IDataService
{
    private HttpHelper httpHelper;

    public DataServiceImpl()
    {
        httpHelper = new HttpHelper();
    }

    @Override
    public void getProduct(String type, String date)
    {
        // System.out.println(Thread.currentThread().getName() +
        // "---DataServiceImpl---type:" + type +",date:" + date);
         httpHelper.requestString(HttpUrlUtil.getProductUrl(/blog_article/type, date/index.html));
//         System.out.println("type:" + type +",date:" + date + "--" + response);
    }

}

HttpHelper代码,其中有些方法省略,详细代码可以下载附件查看
public class HttpHelper
{
    /** Http请求方法对象 */
    private HttpRequestBase request;

    /**
     * 发送Http请求,返回文本形式的请求响应
     * 
     * @param url url地址
     * @return
     */
    public String requestString(String url)
    {
        try
        {
            HttpResponse stringResponse = send(url);
            // 判断请求是否成功
            if (!isResponseSuccessStatus(stringResponse))
            {
                return null;
            }
            System.out.println(Thread.currentThread().getName() + "---url:" + url);
            return parseHttpResponse2String(stringResponse);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("requestString()" + url);
            return null;
        }
    }

    /**
     * 发送Http请求,返回请求响应
     * 
     * @param url url地址
     * @return
     */
    private HttpResponse send(String url) throws Exception
    {
        try
        {
            // 初始化Http请求方法和参数
            initGet(url);
            // 进行Http请求
            return doRequest();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            throw new Exception("http send request exception");
        }
    }

    /**
     * Get方法
     * 
     * @param url
     */
    private void initGet(String url)
    {
        request = new HttpGet(url);
    }

    /**
     * 初始化HttpClient对象
     * 
     * @return HttpClient对象
     */
    private HttpClient getHttpClient()
    {
        HttpClient httpClient = null;
        try
        {
            //ThreadSafeClientConnManager\PoolingClientConnectionManager
            httpClient = new DefaultHttpClient(new PoolingClientConnectionManager(getSchemeRegistry()),
                    prepareHttpParams());
        }
        catch (Exception e)
        {
            e.printStackTrace();
            httpClient = new DefaultHttpClient();
        }
        return httpClient;
    }

    /**
     * 进行Http请求,得到Http响应
     * 
     * @return Http响应
     * @throws Exception
     */
    private HttpResponse doRequest() throws Exception
    {
        HttpClient httpClient = getHttpClient();
//        setProxy(httpClient);// 设置代理
        return httpClient.execute(request);
    }
}

从上面代码可以看到,HttpHelper对象是DataServiceImpl 的全局变量,虽然HttpHelperHttpClient是通过PoolingClientConnectionManager 获取HttpClient的,没有进行同步操作,在多线程就很可能会出现获取出来的对象是相同的,(个人理解),这里抛砖引玉,哪位牛人帮详解下,^_^。
        那接下来怎么修改呢,很简单,只修改HttpHelper中的HttpClient变量使用范围:
public class HttpHelper
{
    /** HttpClient对象 */
    private HttpClient httpClient;

    /**
     * 构造函数
     */
    public HttpHelper()
    {
        httpClient = getHttpClient();
    }

    /**
     * 发送Http请求,返回文本形式的请求响应
     * 
     * @param url url地址
     * @return
     */
    public String requestString(String url)
    {
        HttpGet request = null;
        try
        {
            // 初始化Http请求方法和参数
            request = new HttpGet(url);
            // 进行Http请求
            HttpResponse stringResponse =  httpClient.execute(request);
            // 判断请求是否成功
            if (!isResponseSuccessStatus(stringResponse))
            {
                return null;
            }
            System.out.println(Thread.currentThread().getName() + "---url:" + url);
            return parseHttpResponse2String(stringResponse);
        }
        catch (Exception e)
        {
            request.abort();
            httpClient.getConnectionManager().shutdown();
            e.printStackTrace();
            System.out.println("requestString()" + url);
            return null;
        }
    }

    /**
     * 初始化HttpClient对象
     * 
     * @return HttpClient对象
     */
    private HttpClient getHttpClient()
    {
        try
        {
            // ThreadSafeClientConnManager\PoolingClientConnectionManager
            PoolingClientConnectionManager pccm = new PoolingClientConnectionManager(getSchemeRegistry());
            // pccm.setDefaultMaxPerRoute(20);
            httpClient = new DefaultHttpClient(pccm, prepareHttpParams());
        }
        catch (Exception e)
        {
            e.printStackTrace();
            httpClient = new DefaultHttpClient();
        }
        return httpClient;
    }
}


      有几点自己以后要注意:
       1、要注意代码细节,多测试才能发现问题。
       2、程序引用的代码即使不能钻研的很明白,至少能理解使用的具体场合。
       3、最重要的一点,以后要恶补基础啦, 三天不学习,不知道南北极哪,
       

    
[2] uitableview 下提上拉刷新
    来源: 互联网  发布时间: 2014-02-18
uitableview 上提下拉刷新
#import <UIKit/UIKit.h>
#import "PullToRefreshTableView.h"

@interface ChyoViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>{
    PullToRefreshTableView * tableView;  
    NSMutableArray         * array;      //  数据源
}

@property (nonatomic, retain) PullToRefreshTableView * tableView;
@property (nonatomic, retain) NSMutableArray                  * array;

- (void)updateThread:(NSString *)returnKey;
- (void)updateTableView;

@end



//
//  ChyoViewController.m
//  PullToRefresh
//
//  Created by hsit on 12-1-30.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

#import "ChyoViewController.h"

@implementation ChyoViewController

@synthesize tableView;
@synthesize array;

- (void)dealloc{
    [tableView release];
    [array release];
    [super dealloc];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    array = [[NSMutableArray alloc] init];
    tableView = [[PullToRefreshTableView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
   [table setContentSize:CGSizeMake(320, 960)];
    tableView.delegate = self;
    tableView.dataSource = self;
    tableView.backgroundColor = [UIColor clearColor];
    [self.view addSubview:tableView];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
	[super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
	[super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (void)updateThread:(NSString *)returnKey{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    sleep(2);
    switch ([returnKey intValue]) {
        case k_RETURN_REFRESH:
            [array removeAllObjects];
            [array addObject:[NSString stringWithFormat:@"%d", [array count] + 1]];
            break;
            
        case k_RETURN_LOADMORE:
            [array addObject:[NSString stringWithFormat:@"%d", [array count] + 1]];
            break;
            
        default:
            break;
    }
    [self performSelectorOnMainThread:@selector(updateTableView) withObject:nil waitUntilDone:NO];
    [pool release];
}

- (void)updateTableView{
    if ([array count] < 10) {
        //  一定要调用本方法,否则下拉/上拖视图的状态不会还原,会一直转菊花
        [tableView reloadData:NO];
    } else {
        //  一定要调用本方法,否则下拉/上拖视图的状态不会还原,会一直转菊花
        [tableView reloadData:YES];
    }
}

#pragma mark -
#pragma mark Scroll View Delegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    [tableView tableViewDidDragging];
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    NSInteger returnKey = [tableView tableViewDidEndDragging];
    
    //  returnKey用来判断执行的拖动是下拉还是上拖,如果数据正在加载,则返回DO_NOTHING
    if (returnKey != k_RETURN_DO_NOTHING) {
        NSString * key = [NSString stringWithFormat:@"%d", returnKey];
        [NSThread detachNewThreadSelector:@selector(updateThread:) toTarget:self withObject:key];
    }
}

#pragma mark -
#pragma mark Table View DataSource 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}

- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section{
    if ([array count] == 0) {
        //  本方法是为了在数据未空时,让“下拉刷新”视图可直接显示,比较直观
        tableView.contentInset = UIEdgeInsetsMake(k_STATE_VIEW_HEIGHT, 0, 0, 0);
    }
    return [array count];
}

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString * identifier = @"cell";
    UITableViewCell * cell = [aTableView dequeueReusableCellWithIdentifier:@"cell"];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
    }
    NSInteger row = indexPath.row;
    cell.textLabel.text = [array objectAtIndex:row];
    return cell;
}
@end


    
[3] 基于XMPP协议的手机多边多端即时通讯方案
    来源: 互联网  发布时间: 2014-02-18
基于XMPP协议的手机多方多端即时通讯方案

目   录

基于XMPP协议的手机多方多端即时通讯方案................................................................. 1

目   录.................................................................................................................... 2

一、 开发背景.......................................................................................................... 3

1、       国际背景................................................................................................. 3

2、       国内背景................................................................................................. 3

3、       为什么选择XMPP协议.............................................................................. 3

二、 Xmpp协议介绍................................................................................................ 5

1、 Xmpp协议概述............................................................................................. 5

2、 Xmpp协议内容............................................................................................. 5

3、 Xmpp协议优点............................................................................................. 5

4、 Xmpp协议缺点............................................................................................. 6

5、 Xmpp提供电子名片协议............................................................................... 6

6、 XMPP系统特点............................................................................................. 7

三、 服务器端介绍................................................................................................... 7

1、       什么是Openfire...................................................................................... 7

2、       为什么使用Openfire............................................................................... 7

3、       Windows下搭建服务器............................................................................. 7

4、       Linux下搭建服务器................................................................................. 7

5、Mac下搭建服务器......................................................................................... 8

四、 客户端介绍...................................................................................................... 8

1、       手机客户端.............................................................................................. 8

2、Pc客户端.................................................................................................... 10

2、       Web客户端............................................................................................. 12

五、 环境搭建........................................................................................................ 13

1、       安装JDK................................................................................................ 13

2、       安装OpenFire........................................................................................ 13

3、       安装Mysql............................................................................................. 14

4、       安装Apach Tomcat................................................................................. 14

5、       配置环境............................................................................................... 14

6、       安装项目............................................................................................... 14

7、       设置服务器地址..................................................................................... 15

8、       注册用户............................................................................................... 15

9、       进行相对应的操作................................................................................. 16

六、项目演示.......................................................................................................... 16

1、服务器端设置.............................................................................................. 16

2、客户端设置................................................................................................. 19

七、多方、多端即时通讯........................................................................................ 21

1、QQ、FaceBook、Twitter、MSN Messenger、Yahoo Messenger、AIM、Gadu-Gadu、ICQ、Google Talk、Popo 21

2、PC、Pad、Phone、Web................................................................................ 21

八、.......................................................................................................... 21

1、一个应用程序,多类型账户可同时登陆。.................................................... 21

2、一个应用程序,一个账户可以和其他类型的账户好友聊天。........................ 23

九、全文概要图...................................................................................................... 24

一、开发背景 1、国际背景

随着Internet技术的高速发展,即时通信已经成为一种广泛使用的通信方式。1996年Mirabilis公司推出了世界上第一个即时通信系统ICQ,不到10年间,即时通信(Instant Messaging,简称IM)以发展成为了最流行的网络应用之一。特别是近几年的迅速发展,即时通信的功能日益丰富,它不再是个单纯的聊天工具,它已经发展成集交流、资讯、娱乐、音乐、电视、游戏、电子商务等为一体的综合化信息平台。

2、国内背景

目前国内外及时通信软件IM(Instant Messenger )形势风起云涌,可谓战况空前,IM作为继Email和Web之后最主要的互联网基础应用之一,为商家必争之地。国内的形势由于QQ的垄断性优势明显,表 面稍显平静,实则暗流涌动。目前来看,胖企鹅公司以压倒性优势占据了国内IM市场近八成份额,并且紧紧抓住低端市场,用户数量庞大,盈利丰厚。其他的IM 微软MSN(WLM)、网易POPO、新浪UC、TOM Skype、Google Gtalk等占有率较为惨烈,还有雅虎即时通、AIM、ICQ以及传闻中的Baidu IM和搜狐搜Q以及一些目前并不出名的如校内网的校内通,Lava-lava等等等等,凡在国内叫得上号的叫不上号的互联网企业,几乎没有不推IM的,甚 至连中国移动都力推飞信,希望分得一杯羹。然而这些即时通讯不能实现互联互通,限制了用户的扩展。

3、为什么选择XMPP协议

虽然现在即时通信软件有很多,但是它们之间不能互联互通也阻碍了及时通信用户的继续扩展。因此,在现阶段的各种即使通信服务,没有统一的标准,无法实现互联互通的局面下,而XMPP(Extensible Message and presence Protocol)协议的出现,实现了整个及时通信服务协议的互通。有了这个协议之后,使用任何一个组织或者个人提供的即使通信服务,都能够无障碍的与其他的及时通信服务的用户进行交流。例如google 公司2005年推出的Google talk就是一款基于XMPP协议的即使通信软件。

目前IM即时通信有四种协议:

1.即时信息和空间协议(IMPP)

2.空间和即时信息协议(PRIM)

3.针对即时通讯和空间平衡扩充的进程开始协议SIP

4.XMPP协议:该协议的前身是Jabber,我们采取XMPP协议主来实现IM主要是考虑XMPP协议是以XML为基础的,它继承了在XML环境中灵活的发展性。这表明XMPP是可扩展的,所以XMPP信息不仅可以是简单的文本,而且可以携带复杂的数据和各种格式的文件,也就是说XMPP协议不仅可以用在人与人之间的交流,而且可以实现软件与软件或软件与人之间的交流,目前支持XMPP协议的即时通讯工具有Gtalk、FaceBook IM、Twitter、网易POPO等等通讯工具,具有非常好的发展情景。

正如任何事物都有其自身的发展规律一样,技术和产品的进步也有其自身的规律。

从萌芽到混乱最终标准化,这是互联网产品的基本规律。IM跟其实发展自Email,跟Email有着很多共同点。让我们来对比一下Email目前的情况,或许会有些启示。Email现在已经被广泛应用,谁都不能质疑其互联网第二应用的地位(第一应用是Web)。 Email之所以能广泛地被应用最关键的原因应该是Email有一套开放标准的协议规范(包括SMTP、POP、IMAP 等),任何人都可以基于这些协议规范开放自己的Email产品,不管是Email服务器也好,Email收发客户端也罢还是现在颇为流行的Web形式的 Email界面,它们都是基于同一套标准。在这套标准的框架下,各个Email相关厂商都各自占据产业链的相应位置,相互合作相互竞争,这才是一个百花齐 放的健康竞争环境,而且这种健康竞争最终受益者还是广大用户。

XMPP(www.xmpp.org)由Jabber软件基金会开发,最早在Jabber上实现。Jabber项目由Jeremie Miller在1998年开始的一个免费、开源的项目,用于提供给MSN、Yahoo!的IM服务。由于XMPP是一种基于XML架构的开放式协议,在IM通讯中被广泛采用。

XMPP的基础部分已经在2002-2004年得到了互联网工程任务组(IETF)的批准, 这意味着XMPP在将来就像我们认为理所当然的Internet协议TCP/IP、HTTP、FTP、SMTP、POP一样成为Internet标准;这 意味着以后我们就像使用Web、使用Email和使用FTP一样开放地使用IM。甚至若干年后人们会理所当然地认为163的邮箱可以给Hotmail发邮 件一样,QQ用户也可以添加Gtalk用户,人们会逐渐忘却当年军阀割据纷乱的历史。这是一种革命性的进步!不支持XMPP的IM将会像IBM的 Token-Ring一样孤芳自赏或者像DEC NET协议一样被人遗忘。遥想当年DEC NET和IBM Token-Ring也是多么意气风发羽扇纶巾啊!

在XMPP被批准之前,世界上已经存在了数十种支持XMPP的服务器端和客户端以及数百万用 户。嗅觉灵敏的Google作为开放源代码社区和开放标准的最大受益者,第一时间感受到了这种趋势,所以花重金将Gaim的作者挖去Google,于是就 有了基于XMPP的Gtalk。

开放的标准协议会导致产品的竞争更为健康和良性,整个产业链更为完善。当然产品之间的竞争唯 一的趋势就是同质化,产品发展到后期比拼的只有服务。这一点在传统产业已经被完全验证,互联网产业也不能逃脱。至于到时用户是选Gtalk呢还是选 POPO呢,就像用户现在选Gmail还是163的邮箱一样,可以各有所好。不过IM在扩展功能以及增值服务上还有非常大的竞争余地。

二、Xmpp协议介绍 1、Xmpp协议概述

XMPP(Extensible Messaging and Presence Protocol,前称Jabber[1])是一种以XML为基础的开放式实时通信协议,是经由互联网工程工作小组(IETF)通过的互联网标准。

XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发 送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程 序。而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。

可扩展消息处理现场协议(eXtensible Messaging and Presence Protocol , XMPP) 是一种基于可扩展标记语言(eXtensible Markup Language, XML)的近端串流式即时通信协议。它将现场和上下文敏感信息标记嵌入到XML 结构化数据中, 使得人与人之间、应用系统之间以及人与应用系统之间能即时相互通信。XMPP 协议已被批准为互联网即时通信协议标准。

2、Xmpp协议内容

 XMPP中定义了三个角色,客户端,服务器,网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接管理和信息的路由功能。网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML。

3、Xmpp协议优点

开放—XMPP协议是自由、开放、公开的,并且易于了解。而且在客户端、服务器、组件、源码库等方面,都已经各自有多种实现。

标准—互联网工程工作小组(IETF)已经将Jabber的核心XML流协议以XMPP之名,正式列为认可的实时通信及Presence技术。而XMPP的技术规格已被定义在RFC 3920及RFC 3921。任何IM供应商在遵循XMPP协议下,都可与Google Talk实现连接。

证实可用—第一个Jabber(现在XMPP)技术是Jeremie Miller在1998年开发的,现在已经相当稳定;数以百计的开发者为XMPP技术而努力。今日的互联网上有数以万计的XMPP服务器运作著,并有数以百万计的人们使用XMPP实时传讯软件。

分布式—XMPP网络的架构和电子邮件十分相像;XMPP核心协议通信方式是先创建一个stream,XMPP以TCP传递XML数据流,没有中央主服务器。任何人都可以运行自己的XMPP服务器,使个人及组织能够掌控他们的实时传讯体验。

安全—任何XMPP协议的服务器可以独立于公众XMPP网络(例如在企业内部网络中),而使用SASL及TLS等技术的可靠安全性,已自带于核心XMPP技术规格中。

可扩展—XML命名空间的威力可使任何人在核心协议的基础上建造客制化的功能;为了维持通透性,常见的扩展由XMPP Standards Foundation。

弹性佳—XMPP除了可用在实时通信的应用程序,还能用在网络管理、内容供稿、协同工具、文件共享、游戏、远程系统监控等。

多样性—用XMPP协议来建造及布署实时应用程序及服务的公司及开放源代码计划分布在各种领域;用XMPP技术开发软件,资源及支持的来源是多样的,使得使你不会陷于被“绑架”的困境。

4、Xmpp协议缺点

数据负载太重:随着通常超过70%的XMPP协议的服务器的数据流量的存在和近60%的被重复转发,XMPP协议目前拥有一个大型架空中存在的数据提供给多个收件人。新的议定书正在研究,以减轻这一问题。

没有二进制数据:XMPP协议的方式被编码为一个单一的长的XML文件,因此无法提供修改二进制数据。因此, 文件传输协议一样使用外部的HTTP。如果不可避免,XMPP协议还提供了带编码的文件传输的所有数据使用的Base64。至于其他二进制数据加密会话(encrypted conversations)或图形图标(graphic icons)以嵌入式使用相同的方法。

5、Xmpp提供电子名片协议

vCard是一种现存的、广泛使用的,用户个人信息存储的标准,有点像是电子名片。基础的功能是存储和获取用户的电子身份,该信息是用XML表示的,数据的存储取决于所有现存的Jabber服务器的实现。

6、XMPP系统特点

客户机/服务器通信模式、分布式网络、简单的客户端、XML的数据格式。

三、服务器端介绍 1、什么是Openfire

Openfire 采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议。您可以使用它轻易的构建高效率的即时通信服务器.

Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。

  由于是采用开放的XMPP协议,您可以使用各种支持XMPP协议的IM客户端软件登陆服务.

2、为什么使用Openfire

A、Openfire为Java开源项目

B、 采用开放的XMPP协议

C、 有多种针对不通系统的版本

D、使用Socket通讯

E、 单台服务器可支持上万并发用户,搭建分布式云服务器可轻松提供大量并发用户。

F、 Socket长连接

G、服务器稳定

H、提供接口,可自己开发插件

3、Windows下搭建服务器

JDK1.6 + Openfire For Windows + Mysql5.5 + Tomcat6

4、Linux下搭建服务器

JDK1.6 + Openfire For Linux + Mysql5.5 + Tomcat6

5、Mac下搭建服务器 四、客户端介绍 1、手机客户端

A、ForAndroidClient

手机登录界面

 

手机IM联系人列表

手机用户与PC客户端用户聊天

手机用户与Web端用户聊天 


B、ForMobileClient

C、  ForIphoneClient

D、  ForSymbian

E、ForWp7

2、Pc客户端

A、SparkForJava(OpenSource)

 

PC端用户登录界面

PC端IM联系人界面列表

PC端用户与手机端用户聊天界面

 

PC端用户与Web端用户聊天

B、SparkForC# (OpenSource)

2、Web客户端

A、RIA (Flex   And   Silverlight)

B、 Html5

C、Web2.0

Web端登录

 

Web端与PC聊天

Web端与手机端聊天

五、环境搭建 1、安装JDK

下载官网的JDk,并且正常安装,待安装完成后设置环境变量。

2、安装OpenFire

下载Openfire,并正常默认安装。

3、安装Mysql

下载安装Mysql,指定Mysql的用户名和密码,以及数据库使用的编码。确定是否允许远程访问该数据库。

4、安装Apach Tomcat

下载Apach基金会下的Tomcat服务器,并且解压安装。

5、配置环境

登陆Openfire服务器控制台,设置相关的信息。如:端口,插件等。

并将项目部署到Apach tomcat中。

6、安装项目

1、  ForAndroid

从Tomcat中下载android的项目XmppClientForAndroid.apk,并在手机中安装。

2、  ForPc

从Tomcat中下载Pc的项目 Spark.exe,并在手机中安装。

3、  ForWeb

打开Tomcat中的项目,直接运行登陆。

点击运行后:

7、设置服务器地址

ForAndroid、ForPc、ForWeb 都提供了个服务器地址设置的地方。默认Openfire的端口为5222.(除,Silverlight 的端口必须为 4502-4532)

8、注册用户

可以在服务器端直接注册用户,也可以在客户端注册用户。

9、进行相对应的操作

相对应的即时通讯方面的操作。

六、项目演示 1、服务器端设置

A、Openfire 控制台

 

服务器主界面:

控制台主界面:


 

控制台内部管理:


用户/组管理:

会话管理:


聊天管理:


 

 

A、Mysql数据库

 

 

数据库表结构:

 

2、客户端设置

A、ForAndroid

 

B、ForPc

 

 

C、ForWeb

 

七、多方、多端即时通讯 1、QQ、FaceBook、Twitter、MSN Messenger、Yahoo Messenger、AIM、Gadu-Gadu、ICQ、Google Talk、Popo

研读不同的通信协议,将Internet中常用的IM集成在一起,使得用户在操作系统中不必安装太多的聊天软件。

2、PC、Pad、Phone、Web

用户可以通过PC、Pad、Phone、Web等任意一个client聊天。

八、 1、一个应用程序,多类型账户可同时登陆。

类似于Live Mail,没个账户只能和本账户下的朋友聊天。

有些国外的软件(Palringo、Trillian)以实现该功能.

 

 

 

2、一个应用程序,一个账户可以和其他类型的账户好友聊天。

XMPP IM 与非XMPP 的其他IM互联互通方法: 如果对方不是XMPP 体系中的用户, 就要在企业IM服务器上架设协议转换网关。在XMPP 的IM服务器上架设IM协议转换网关, 要遵守RFC3922 协议, 这个协议规定了XMPP 与公共显示和即时消息( CPIM)的映射。这里描述一下一个用户与MSN 用户的交流。在与MSN 用户交流之前, 企业IM用户首先设置一个MSN 用户到XMPP—MSN 协议转换网关上( 告诉MSN 的用户与密码给网关) , 现在网关就可以用这个MSN账号与MSN 系统进行交流了。绑定了MSN 用户的企业IM用户登录企业IM服务器后, 协议转换网关把MSN 账号的好友的MSN 账号返回给用户, 并在里面做了映射, 映射到了本地XMPP 账号。现在用户可以跟与本地XMPP 用户一样, 与MSN 账号的用户进行交流了。

九、全文概要图

本文章参考了许多网络的资料,忘了文章链接。在这先向他们道个歉。

基于xmpp协议的多端即时通讯方案.pdf


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3