PRTX SDK 5.0 C#开发实例教程一(登录)PRTX 介绍
若需要本文例子相关源代码,请访问
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;
}
}
|
PRTX SDK 5.0 C#即时通讯IM开发实例教程一(登录)
最新推荐文章于 2024-03-10 15:47:00 发布