PRTX SDK 5.0 C#开发实例教程一(登录)PRTX 介绍
安装
C#例子开发说明
登录窗口
// 下面是加上网络选项。支持 UDP , TCp 以及代理登录。
开始登录
以下是点登录按扭的代码
点了登录后,就可以开始显示正在登录状态,通过调用定时器来显示动画。提示用户等待登录。
登录成功或者失败
若需要本文例子相关源代码,请访问
http://www.webp2p.com/download/download.htm
PRTX
是快速即时通讯开发包,功能包括用户登录,文字聊天,好友列表,组织架构,图文发送,文件上传与下载,P2P
语音,视频,文件传输,文字通讯等组件和例子,并支持服务器二次开发。
客户端组件由以下部分组成,
服务器组件由IMServer.exe
和zhdb.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
登录方式,SOCK5
、SOCK4
、HTTP
分别为使用sock5
、sock4
、http
代理方式。绝大部情况,无需要设代理即可登录。
以下是登录窗口加载的代码
private voidFrmLogin_Load(object sender, System.EventArgse)
{
//这是写日志文件方法,如果要写日志,请事先手工创建ClientLog.txt,否则不会写日志。
frm1.GetImx().Start_Up("C:\\ClientLog.txt");
// 下面是加上网络选项。支持 UDP , TCp 以及代理登录。
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;
}
}