c# 仿QQ程序(6)-客户端类

2009年3月28日星期六

c# 仿QQ程序(6)-客户端类

新建一个工程



添加新类 CheckOutIpPoint 类 获取IP和端口



public class CheckOutIpPoint
{
private string ipadd="";
private int ipport=0;

public string IpAdd
{ //ip
get
{
return(ipadd);
}
}

public int Port
{// 返回端口号,只读
get
{
return(ipport);
}
}


public CheckOutIpPoint(string IpEndPoint)
{
string ip="";
string port="";
bool go=false;
for(int i=0;i<IpEndPoint.Length;i++)
{
if(IpEndPoint[i]==':') //ip和端口号是用:隔开的
{
go=true;
continue;
}
if(!go)
{
ip+=IpEndPoint[i].ToString().Trim();
}
else
{
port+=IpEndPoint[i].ToString().Trim();
}
}
this.ipadd=ip;
this.ipport=Convert.ToInt32(port)-1;
}
}



添加新类CheckOutNum 获取QQ昵称和号码



public class CheckOutNum
{
private string[] parmer =new string[2]{"",""};

public string QQname
{ // 获取传进来的值的QQ昵称
get
{
return(parmer[0]);
}
}

public string QQnumber
{ // 获取传进来的值的QQ号码
get
{
return(parmer[1]);
}
}
public CheckOutNum(string NameAndNum)
{
for(int i=0;i<2;i++)
{
parmer[i]="";
}
int j=0;
for(int i=0;i {//name(number)
if(NameAndNum[i]=='(')
{
j=1;
continue;
}
if(NameAndNum[i]==')')
{
break;
}
parmer[j]+=NameAndNum[i].ToString().Trim();
}
}
}



添加新类 getSerInf 获取xml结点资料



using System;
using System.Xml;
using System.IO;



public class getSerInf
{
public getSerInf()
{
}
public static string ReadXmlNode(string XmlFileUrl,string Node)
{ //获取xml结点下的内容
if(File.Exists(XmlFileUrl))
{
XmlDocument SerInf=new XmlDocument();
SerInf.Load(XmlFileUrl);
XmlNode FirstNode=SerInf.SelectSingleNode(Node).FirstChild;
return(FirstNode.InnerText);
}
else
{
return("-1");
}
}
}



添加新类 Login类 检查登陆信息

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;



public class Login
{
public Login()
{
}


public static bool QLogin(string uid,string pwd)
{// 登陆到服务器验证该用户名密码的用户是否为合法用户
string SerInfFile="SerInf\\SerInf.dat";
string StrIp=getSerInf.ReadXmlNode(SerInfFile,"//root//server//ip");
string StrPort=getSerInf.ReadXmlNode(SerInfFile,"//root//server//port");
int port=int.Parse(StrPort);
TcpClient tcpclnt = new TcpClient();
tcpclnt.Connect(StrIp,port);
Stream stm = tcpclnt.GetStream();
UTF8Encoding asen = new UTF8Encoding();
byte[] ba = asen.GetBytes("1;" + uid +";"+ pwd);
stm.Write(ba, 0, ba.Length);
byte[] bb = new byte[1];
int k = stm.Read(bb, 0, 1);
string req = System.Text.Encoding.UTF8.GetString(bb);
stm.Close();
tcpclnt.Close();
if (req.Trim() == "1")
{
return(true);
}
else
{
return(false);
}
}


public static bool SendMsgToGetFriendInf(string UserNumber)
{// 向服务器发送请求以获取该用户的好友列表

StreamWriter FriendInf=new StreamWriter(UserNumber+"\\FriendInf.dat");
string SerInfFile="SerInf\\SerInf.dat";
string StrIp=getSerInf.ReadXmlNode(SerInfFile,"//root//server//ip");
string StrPort=getSerInf.ReadXmlNode(SerInfFile,"//root//server//port");
int port=int.Parse(StrPort);
TcpClient tcpclnt = new TcpClient();
tcpclnt.Connect(StrIp,port);
Stream stm = tcpclnt.GetStream();
UTF8Encoding asen = new UTF8Encoding();
byte[] ba = asen.GetBytes("2;" + UserNumber);
stm.Write(ba, 0, ba.Length);
byte[] bb = new byte[1024];
int k = stm.Read(bb, 0, 1024);
while(k>0)
{
string Str=System.Text.UTF8Encoding.UTF8.GetString(bb,0,k);
Console.WriteLine(Str);
FriendInf.Write(Str);
k = stm.Read(bb, 0, 1024);
}
FriendInf.Close();
stm.Close();
tcpclnt.Close();
return(true);
}

public static bool SendMsgToGetOnlineInf()
{/// 发送获取所有在线用户列表的请求

while(!UserInf.iniOnlineInf())
{}
StreamWriter OnlineInf=new StreamWriter("online.dat");
string SerInfFile="SerInf\\SerInf.dat";
string StrIp=getSerInf.ReadXmlNode(SerInfFile,"//root//server//ip");
string StrPort=getSerInf.ReadXmlNode(SerInfFile,"//root//server//port");
int port=int.Parse(StrPort);
TcpClient tcpclnt = new TcpClient();
tcpclnt.Connect(StrIp,port);
Stream stm = tcpclnt.GetStream();
UTF8Encoding asen = new UTF8Encoding();
byte[] ba = asen.GetBytes("6;");
stm.Write(ba, 0, ba.Length);
byte[] bb = new byte[1024];
int k = stm.Read(bb, 0, 1024);
while(k>0)
{
string Str=System.Text.UTF8Encoding.UTF8.GetString(bb,0,k);
OnlineInf.Write(Str);
k = stm.Read(bb, 0, 1024);
}
OnlineInf.Close();
stm.Close();
tcpclnt.Close();
return(true);
}
///


public static string AddFriend(string Owner,string Friend)
{// 向服务器发送请求!添加好友
string SerInfFile="SerInf\\SerInf.dat";
string StrIp=getSerInf.ReadXmlNode(SerInfFile,"//root//server//ip");
string StrPort=getSerInf.ReadXmlNode(SerInfFile,"//root//server//port");
int port=int.Parse(StrPort);
TcpClient tcpclnt = new TcpClient();
tcpclnt.Connect(StrIp,port);
Stream stm = tcpclnt.GetStream();
UTF8Encoding asen = new UTF8Encoding();
byte[] ba = asen.GetBytes("7;" + Owner +";"+ Friend);
stm.Write(ba, 0, ba.Length);
byte[] bb = new byte[2];
int k = stm.Read(bb, 0, 2);
string req = System.Text.Encoding.UTF8.GetString(bb);
stm.Close();
tcpclnt.Close();
switch(req)
{
case "-1":
return("sorry!要添加的好友不存在!");
case "0\0":
return("恭喜!添加好友成功!请刷新");
case "1\0":
return("对不起!该好友在你的好友列表中!");
default:
return("未知错误!");
}
}
}



添加新类 PlaySound 系统声音类





using System;
using System.Runtime.InteropServices;



public class PlaySound
{
public PlaySound()
{

}


[DllImport("winmm.dll")] //使用音乐


private static extern long mciSendString(string strCommand, string strReturn, int iReturnLength, IntPtr hwndCallback);
private static void GetWavAndOpen(int SoundId)
{
string sFileName;
switch(SoundId)
{
case 1://系统消息
sFileName="sound\\System.wav";
break;
case 2://收到消息
sFileName="sound\\Msg.wav";
break;
case 3://功能切换
sFileName="sound\\Folder.wav";
break;
default:
sFileName="sound\\Call.wav";
break;
}
string sCommand = "open \"" + sFileName + "\" type mpegvideo alias MediaFile"; // MediaFile是选择播放文件类型
string ret = null;
mciSendString(sCommand, ret, 0, IntPtr.Zero);
}


public static void play(int SoundId)
{
StopPlay();
GetWavAndOpen(SoundId);
string sCommand = "play MediaFile";
string ret = null;
mciSendString(sCommand, ret, 0, IntPtr.Zero);
}
private static void StopPlay()
{
string sCommand = "close MediaFile";
string ret = null;
mciSendString(sCommand, ret, 0, IntPtr.Zero);
}
}









添加新类 Regx 验证数据类



using System;
using System.Text.RegularExpressions;





public class Regx
{
public Regx()
{

}


public static bool isNull(string str)
{// 验证数据是否为空

if(str.Trim()==""||str=="")
{
return(false);
}
else
{
return(true);
}
}
public static bool isNumber(string number)
{
Regex check=new Regex("\\d{8}");
if(check.IsMatch(number,0))
{
return(true);
}
else
{
return(false);
}
}
public static string CheckUserNumber(string number)
{
string temp="";
if(number.Length!=8)
{
for(int i=0;i<8-number.Length;i++)
{
temp+="0";
}
temp+=number;
}
else
{
temp=number;
}
return(temp);
}
}





添加新类 SendMessage 发送消息类



using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Xml;
using System.IO;
using System.Text;





public class SendMessage
{
private string ToIpName="";
private string MSG="";
private string IpEndPoint="";
public SendMessage()
{

}
private bool result=true;

public bool Result
{// 获取发送消息的结果
get
{
return(result);
}
}
private string msg;
public string Msg
{// 需要发送的消息
get
{
return(msg);
}
set
{
msg=value;
}
}
private string ToWho;

public string ToDistUser
{// 目标用户
set
{
ToWho=value;
}
}
public void send()
{
Thread th=new Thread(new ThreadStart(MessageSend));
th.Start();
}


private void MessageSend()
{// 向指定用户发送消息

try
{
string TOIpNumber="";
CheckOutNum NAN=new CheckOutNum(ToWho);
this.ToIpName=NAN.QQname;
this.MSG=msg;
TOIpNumber=NAN.QQnumber;
XmlDataDocument Xml=new XmlDataDocument();
Xml.Load("online.dat");
XmlNode root=Xml.SelectSingleNode("root");
for(int i=0;i<root.ChildNodes.Count;i++)
{
if(root.ChildNodes[i].ChildNodes[0].InnerText.Trim()==TOIpNumber.Trim())
{
this.IpEndPoint=root.ChildNodes[i].ChildNodes[1].InnerText.Trim();
break;
}
}
CheckOutIpPoint IEP=new CheckOutIpPoint(IpEndPoint);
TcpClient Send=new TcpClient();
Send.Connect(IEP.IpAdd,5281);
Stream stm=Send.GetStream();
UTF8Encoding asen = new UTF8Encoding();
byte[] ba = asen.GetBytes("2;"+ShareDate.ThisUser.Trim()+";"+MSG);//参数格式为(标识;原用户;消息内容)
stm.Write(ba, 0, ba.Length);
Send.Close();
result=true;
}
catch
{
result=false;
}
}
}







添加新类 ShareDate 聊天窗口类



using System;
using System.Collections;



public class ShareDate
{
private static ArrayList winhand=new ArrayList();

// 用户保存当前聊天窗口的窗口句柄
public static ArrayList WinHand
{
get
{
return(winhand);
}
set
{
winhand=value;
}
}
private static ArrayList winname=new ArrayList();
// 用户保存当前存在的窗体名称,便于检索,和WinHand一一对应

public static ArrayList WinName
{
get
{
return(winname);
}
set
{
winname=value;
}
}
private static ArrayList msg=new ArrayList();

// 用于保存当前收到的消息!

public static ArrayList Msg
{
get
{
return(msg);
}
set
{
msg=value;
}
}
private static string thisuser;

// 用于保存当前登陆用户号码

public static string ThisUser
{
get
{
return(thisuser);
}
set
{
thisuser=value;
}
}
private static ArrayList qqnumber=new ArrayList();
// 保存当前用户的好友信息(号码)

public static ArrayList QQNumber
{
get
{
return(qqnumber);
}
set
{
qqnumber=value;
}
}
private static ArrayList qqname=new ArrayList();

//保存当前用户的好友信息(昵称)

public static ArrayList QQName
{
get
{
return(qqname);
}
set
{
qqname=value;
}
}
private static int mainformhand;

// 保存主窗体的句柄

public static int MainFormHand
{
get
{
return(mainformhand);
}
set
{
mainformhand=value;
}
}
public ShareDate()
{

}
}



添加TrafficMsg类 用于不同的窗体中发送消息



using System;
using System.Runtime.InteropServices;



public class TrafficMsg
{
public TrafficMsg()
{

}

// 提供Win32的消息发送,发送后等到处理完成然后返回

[DllImport("User32.dll",EntryPoint="SendMessage")]
public static extern int SendMessage(int hWnd,int Msg,int wParam,int lParam);

// 提供Win32的消息发送,发送后立即返回

[DllImport("User32.dll",EntryPoint="PostMessage")]
public static extern bool PostMessage(int hWnd,int Msg,int wParam,int lParam);
}

0 评论:

发表评论