本项目用到的主要技术有:
WCF、socket网络编程(UDP通信通信、TCP通信)、数据库技术、数据库通用访问类、三层架构 ,其中三层架构的UI层在客户端,BLL和DAL层在服务端,WCF技术包括两个契约,即服务契约、数据契约,服务契约有:
1.(登陆)List<UserMsg> UserLogin(string UserName, string UserPwd, string LoginIP, string LoginPort, out int LoginState, out List<UserMsg> WhoAddUserNameAsFriend, out List<string> GroupNames, out UserMsg LoginUserMsg);
2.(下线)
void UserOffLine(下线者的UserName)
3.(注册)int UserRegister(UserName,UserPwd,PhoneNum,Email,Address)
4.(添加好友)UserMsg QueryFriend(UserName);
Void AddFriend(UserName ,GoodFriendName,GroupName);
5.(修改信息) int UserUpdate(UserName,UserPwd,PhoneNum,Email,Address)
6.(同意添加该好友)UserMsg AggreeAddFriend(UserName,GoodFriendName, GroupName);//把GoodFriend表中Flag字段改为True,返回GoodFriendName的信息;
(不同意添加该好友)Void DisaggreeAddFriend(UserName,GoodFriendName);//
7.GoodFriend表中与UserName,GoodFriendName相同的一行删除;
登陆(上线):
当客户端登陆时调用服务契约的List<UserMsg> UserLogin(string UserName, string UserPwd, string LoginIP, string LoginPort, out int LoginState, out List<UserMsg> WhoAddUserNameAsFriend, out List<string> GroupNames, out UserMsg LoginUserMsg);
方法,返回给UI值(0表示登陆成功,1表示账号不存在,2表示密码错误);
登陆成功后List
用UDP方式向该用户的各个好友发送(该好友上线(void SendOnLine(上线者的UserName , PhoneNum, Email, Address ,UserIP,IPort))的)消息
在客户端登陆成功后,服务端需要给该登陆者的所有在线好友发送消息:该登陆者上线了,此时服务端用的是UDP通信方式告诉该登陆者的所有好友,所以客户端需要创建一个UDP监听线程,监听从服务端发来的消息,之所以要用UDP是因为,在循环发送给该登陆者的所有好友的消息过程中如果用TCP连接,则发送一个需要三次握手成功之后才能发送消息,如果有一个握手不成功则剩下的全部发送失败,风险比较大,所以应该用UDP通信方式,给客户端发送
下线:
当客户端下线(UserOffLine(下线者的UserName)(服务契约))时或者异常关闭tcp连接时,服务端修改该用户的状态,用套接字方式向该用户的各个好友发送(该用户下线(SendOffLine(下线者的UserName))的)消息。
注册:
UI调用BLL的UserRegister(UserName,UserPwd,PhoneNum,Email,Address)方法返回给UI值(0表示成功,1表示不成功);
添加好友:
UserMsg QueryFriend(UserName);UserMsg为NULL表示未找到,否则找到!
Void AddFriend(UserName, GoodFriendName,GroupName);
UserMsg AggreeAddFriend(UserName,GoodFriendName,GroupName);//把GoodFriend表中Flag字段改为True,返回GoodFriendName的信息;
Void DisaggreeAddFriend(UserName,GoodFriendName);//把GoodFriend表中与UserName,GoodFriendName相同的一行删除;
客户端向服务端发送添加好友请求,服务端把该好友的信息返回给客户端,客户端确认添加(确认信息包括(添加到的分组名))后向服务端发送确认添加请求,服务端操作数据库,然后修改GoodFriend表(添加一行,这行的Flag列为false),(描述:如果对方同意则修改该行的Flag列为True,同时添加对方为好友,否则删除该行)
修改信息:
UI调用BLL的UserUpdate(UserName,UserPwd,PhoneNum,Email,Address)方法,修改数据库后返回给UI信息(0表示修改成功,1表示修改不成功)
同意添加该好友:
UserMsg AggreeAddFriend(UserName,GoodFriendName, GroupName);//把GoodFriend表中Flag字段改为True,返回GoodFriendName的信息;
不同意添加该好友:
Void DisaggreeAddFriend(UserName,GoodFriendName);//GoodFriend表中与UserName,GoodFriendName相同的一行删除;
数据契约中包括的字段主要有:
int flag; 用于UDP通讯中,序列化与反序列化后标示该数据对象的表明的意思,0表示该用户上线,1表示当我在线的时候该数据对象想要添加我为好友,2表示该对象下线,3表示我添加的好友同意了我的请求。
string userName;
string groupName;
string userPwd;
string phoneNum;
string email;
string address;
string userIP;
string iPort;
int state;