PRTX SDK 5.0 C#即时通讯IM开发实例教程一(登录)

来源:互联网 发布:动漫海报淘宝店推荐 编辑:程序博客网 时间:2024/06/05 04:22
PRTX SDK 5.0 C#开发实例教程一(登录)PRTX 介绍

若需要本文例子相关源代码,请访问 http://www.webp2p.com/download/download.htm

PRTX 是快速即时通讯开发包,功能包括用户登录,文字聊天,好友列表,组织架构,图文发送,文件上传与下载,P2P语音,视频,文件传输,文字通讯等组件和例子,并支持服务器二次开发。

客户端组件由以下部分组成,


服务器组件由IMServer.exezhdb.ocx组成,其中zhdb.ocx可做服务器部分的自定义开发。

安装
安装请参考<<PRTX即时通讯SDK5.0.0_API>>
包括服务器安装和客户端组件安装。

C#例子开发说明

登录窗口

登录所用到的几个方法是:
1.        Start_Up 初始化。
2.        SetNetwork 设置服务器IP。
3.        Login 开始登录。
服务器返回的事件是:
1.        OnLoginReply 登录成功。
2.        OnSysError 登录失败的错误码。


登录窗口分别放置了三个panel上,为了方便大家看到,我们把三个panel分开放,第一个panel是放置账户输入框txtName,密码输入框txtPass等控件,还有一个cboxLoginType,这个是ComboBox,用来选择用户登录、号码登录,或者Email登录等。


第二个panel放置了网络类型选择ComboBox,服务器IP,以及端口输入框,这个使用户在登录前可以设置需要登录的服务器或者代理服务器等。


其中UDP为不使用代理的UDP登录方式,TCP为不使用代理的TCP登录方式,SOCK5SOCK4HTTP分别为使用sock5sock4http代理方式。绝大部情况,无需要设代理即可登录。

 

以下是登录窗口加载的代码
private voidFrmLogin_Load(object sender, System.EventArgse)
{
        //这是写日志文件方法,如果要写日志,请事先手工创建ClientLog.txt,否则不会写日志。
        frm1.GetImx().Start_Up("C:\\ClientLog.txt");

//
下面是加上网络选项。支持UDPTCp以及代理登录。
        cboxNetWorkType.Items.Add("UDP");
        cboxNetWorkType.Items.Add("TCP");
        cboxNetWorkType.Items.Add("SOCK5");
        cboxNetWorkType.Items.Add("SOCK4");
        cboxNetWorkType.Items.Add("HTTP代理");
        cboxLoginType.SelectedIndex= 0;//用户号码登录
        pnlNetworkPanel.Visible = false;   //设网络面板默认不显示
        pnlLoginIn.Visible = false;
}
Start_Up这个函数必须是zhim.ocx第一个调用函数。


登录过程,点登录按扭的事件。调用SetNetwork设置网络,并且调用Login来登录,如果登录成功将触发主窗Zhim.ocx的 OnLoginReply 事件,如果登录失败,将触发 OnSysError 事件,在OnSysError事件显示登录中的错误。比如密码错误,用户名不存在,用户过期等错误。


开始登录

以下是点登录按扭的代码
private voidbtnLogin_Click(object sender, System.EventArgse)
{
    ////这个frm1是主窗口,我们把Zhim.ocx放在主窗口中,只有主窗口完全退出,Zhim.ocx实例不存在了,程序也就会退出了。其它的窗口都通过frm1.GetImx()来获得对Zhim.ocx实例对像的调用。
    frm1.GetImx().SetNetwork(txtSvrIP.Text,System.Convert.ToInt32(txtSvrPort.Text),"",0,"","",Constant.PROXY_NO);
    //以下判断账户有效性
    int loginType = cboxLoginType.SelectedIndex;
    stringsName = txtName.Text;
    stringsPass =  txtPass.Text ;
     int uId = 0;
    if (sName.Length == 0)
    {
        MessageBox.Show("请输入账号!",Constant.sAppName  );
        return;
    }
    if(sPass.Length == 0)
    {
        MessageBox.Show("请输入密码!",Constant.sAppName  );
    }
    if(loginType == 0)     //号码登录
    {
        if(IsNumber(sName))
        {
             //是数字
             uId = Convert.ToInt32(sName);
        }
        else
        {
             //不是数字,也可使用号码或者用户名或者Email登录
             MessageBox.Show("账号必须全由数字组成!",Constant.sAppName );
        }
    }
    //以下为使用号码或者用户名或者Email登录
    if(loginType== 0)//号码登录
        frm1.GetImx().Login( Constant.STATUS_ONLINE, uId,"","", sPass, "",0, 0, "CN", 0,"", 0);
    if(loginType== 1)//用户名登录
        frm1.GetImx().Login(Constant.STATUS_ONLINE, 0, sName,"", sPass, "",0, 0, "CN", 0, "", 0);
    if(loginType== 2)//Email登录
        frm1.GetImx().Login(Constant.STATUS_ONLINE, 0,"",sName, sPass, "", 0, 0, "CN", 0,"",0);
    timer1.Enabled = true;
    pnlLoginIn.Visible = true;
    pnlNetworkPanel.Visible = false;
    pnlUser.Visible = false;
     }

点了登录后,就可以开始显示正在登录状态,通过调用定时器来显示动画。提示用户等待登录。
     privatevoid timer1_Tick(objectsender, System.EventArgs e)
         {
              nTimerCount= nTimerCount + 1;
              if (nTimerCount == 1)
                   lblSigningOn.Text= "登录中..";
              if (nTimerCount == 2)
                   lblSigningOn.Text= "登录中....";
              if (nTimerCount >= 3)
              {
                   nTimerCount = 0;
                   lblSigningOn.Text= "登录中......";
              }
         }
登录成功或者失败
如果登录成功,会产生OnLoginReply事件,这个事件中,可以设定好用户目录,
         privatevoid IMx_OnLoginReply(objectsender, AxZhIM2.__ZhIMx_OnLoginReplyEvent e)
         {
              lmsg("登录成功!");
            //设定默认文件或者图片接收目录
            IMx.PicRecvDir =System.IO.Path.GetDirectoryName(Application.ExecutablePath.ToString()) + "\\IShow\\" + IMx.UIN.ToString() + "\\Temp";
            //如果目录不存在,就建立
            if(!System.IO.Directory.Exists(IMx.PicRecvDir))
                System.IO.Directory.CreateDirectory(IMx.PicRecvDir);
            m_fmLogin.Close();//关了登录窗口
            //显示用户名
            lblMyNick.Text = IMx.sNick+ "[" + Convert.ToString(IMx.UIN) + "]";
            //确认头像号在本地头像文件范围内,以免访问到非法图片。
            if(IMx.nIconID  >Constant.HEAD_NUM)
                   IMx.nIconID = Constant.HEAD_NUM;
              if(IMx.nIconID<0 )
                   IMx.nIconID = 0;
            //生成本地头像的图片文件路经
              string sPath = System.Environment.CurrentDirectory+ Constant.PathHead + "\\Online\\"  + Convert.ToString(IMx.nIconID)+ ".bmp";
              pbMyHead.Image=  new Bitmap(sPath); //头像显示
            //设置离线上传URL
             m_sUploadURL    = "http://bbs.webp2p.com:8004/upload/getfile.php?user="+ IMx.UIN.ToString() + "&tempid="+ IMx.nTempID  ;  
            //设置离线下载的根目录
            IMx.DownloadURL = "http://bbs.webp2p.com:8004/upload/upfiles/";
              
            
            //如果不是掉线后重新登录,就要获得我的好友列表
             if (!m_bReLogin)
               IMx.ReqContactList(IMx.nParentUIN, 0);//取下我的组织架构(IMx.nParentUIN为我的组织号,对应Friends表的GroupUIN号)和全部好友
         
            //显示登录在线状态,比如在线,隐身等
              if (IMx.nStatus == Constant.STATUS_ONLINE)
                   cboMyStatus.SelectedIndex= 0;
              if (IMx.nStatus == Constant.STATUS_OFFLINE)
                   cboMyStatus.SelectedIndex= 3;
              if (IMx.nStatus == Constant.STATUS_NA)
                   cboMyStatus.SelectedIndex= 2;
              if (IMx.nStatus == Constant.STATUS_INVISIBLE)
                   cboMyStatus.SelectedIndex= 1;
         
         }


如果登录不成功,则在OnSysError事件中显示错误信息

          private voidIMx_OnSysError(object sender, AxZhIM2.__ZhIMx_OnSysErrorEvent e)
         {
               switch (e.nCode)
              {
                   case Constant.E_ALLPACKAGE_TIME_OUT://掉线了,需要重新Start_Up,可以在这里做自动重登录。掉线后重试上线
                   if (IMx.UIN == 0) //如果还没有登录
                    {
                       m_fmLogin.SetLoginFail("登录超时!");
                    }
                       break;
                    case Constant.E_NO_UIN:
                       lmsg("登录时,如果用户输入的帐号不存在,会返回这个错误码。");
                   m_fmLogin.SetLoginFail("登录不成功,账户不存在。");
                       break;
                   case Constant.E_PWD:
                       lmsg("登录时,如果用户输入的密码不对,会返回这个错误码。");
                   m_fmLogin.SetLoginFail("登录不成功,密码不对");
                    break;
                   case Constant.E_EXPIRED:
                       lmsg("登录时,如果用户账户过期,会返回这个错误。");
                    m_fmLogin.SetLoginFail("登录不成功,用户账户过期");
                    break;
                   case Constant.E_LOGIN_FAIL:
                       lmsg("登录不成功,其它未知原因,一般不会出现这个错误码。");
                   m_fmLogin.SetLoginFail("登录不成功,其它未知原因");
                    break;
                   case Constant.E_LOW_VERSION:
                       lmsg("登录时,Login 的nLowVersion 这个参数,表示是客户端版本号,如果小于服务器上IMServer.ini配置的LimitVersion,则会返回这个错误码,表示客户端版本号过低,不允许登录。");
                   m_fmLogin.SetLoginFail("版本太低");
                    break;
                    case Constant.E_TIME_OUT:
                       lmsg("表示有包发送出错,包命令是" + e.nCmd);
                       if (e.nCmd == 18)
                       {
                            lmsg("登录包超时,无法登录,登录超时");
                            m_fmLogin.SetLoginFail("登录超时,检查服务器设置或者网络。");
                       }//else
                       //  lmsg("其它的一般不需要处理。如果是网络不通,会出现E_ALLPACKAGE_TIME_OUT错误。所以只需要处理E_ALLPACKAGE_TIME_OUT");
                       break;
                    case Constant.E_USER_ALREADY_LOGIN:
                       lmsg("用户在其它地方登录,您将被迫下线。");
                    MessageBox.Show("用户在其它地方登录,您将被迫下线。",Constant.sAppName );
                     //在这里可以显示图标为下线状态。
                    lblMyNick.Text ="已经掉线";
                    cboMyStatus.SelectedIndex= 3;
                       break;
                    default:
                       lmsg("执行命令:" + e.nCmd + "时出现,未定义的错误" + e.nCode);
                       break;
              }
         }