📄 servicemain.cs
字号:
this.sendMsgToOneUser(6, buf, e.IP, e.Port);//告诉用户与服务器保持联接状态
//this.WirteLog("告诉用户" + this.systemUsers[msg.ID].UserID + "与服务器保持联接状态");
//}
//else
// this.WirteLog("用户" + msg.userId + "断开与服务器的联接。");
}
#endregion
#region 用户登录过程,如果成功则返回部门数,不成功则返回0
/// <summary>
/// 用户登录过程,如果成功则返回部门数,不成功则返回0
/// </summary>
/// <param name="e"></param>
private void onUserLogin(DataArrivalEventArgs e)
{
IMLibrary.ServerMsg cmsg = IMLibrary.Serializers.ByteToObj(e.Data) as ServerMsg;
if (cmsg == null)
{
this.WirteLog("系统收到数据,但无法识别的消息类型。非法用户-" + e.IP.ToString() + ":" + e.Port.ToString());
return;
}
string [] User=IMLibrary.TextEncoder.bytesToText(cmsg.msgContent).Split('|');
string userID = User[0];
string password = User[1] ;//获得用户发送的密码
string departmentVersion = User[2];
string usersVersion = User[3];
//object obj;
//IMLibrary.SqlData.DataAccess.ExecProc("IsMatchingUser", out obj, userID, password);//执行存储过程,检查用户密码是否匹配,即是否正确
bool t=false ; //
if (!t || IMLibrary.DNS.IsDomainUser(userID, password, "gz.com")) //(this.IsDomainUser(userID, password))//是真密码
{
IMLibrary.UserInfo user = findUser(userID);
if (user != null)
{
if (user.State != 0)//如果用户已经在线
this.sendMsgToOneUser(13, IMLibrary.TextEncoder.intToBytes(0), user.IP, user.Port);//通知其已在别处登录,让原先登录的退出
this.UpdateUserInfo(user, e.IP, e.Port, 1);//更新登录用户在线信息
this.sendDepVersionToUser(e.IP, e.Port);//发送部门版本号给登录用户并告之登录成功
if (departmentVersion == this.VersionDepAndUser.departmentVersion.ToString() && usersVersion == this.VersionDepAndUser.usersVersion.ToString())//如果组织机构与用户版本号相同则发送在线用户信息给上线用户
{
uint count = 0;
UserCollections tempUsers = new UserCollections();
for (uint index = 1; index < this.systemUsers.Length; index++)
{
if (this.systemUsers[index].State != 0)//如果用户在线,则加入在线用户集合
{
tempUsers.add(this.systemUsers[index]);
count++;
if (count == 5)
{
byte[] buf = IMLibrary.Serializers.ObjToByte(tempUsers);
this.sendMsgToOneUser(23, buf, e.IP, e.Port);//将在线用户集合发送给上线用户
System.Threading.Thread.Sleep(10);
this.sendMsgToOneUser(23, buf, e.IP, e.Port);//将在线用户集合发送给上线用户
///连续两次发送
count = 0;
tempUsers = new UserCollections();
}
}
}
if (tempUsers != null)
{
byte[] buf = IMLibrary.Serializers.ObjToByte(tempUsers);
this.sendMsgToOneUser(23, buf, e.IP, e.Port);//将在线用户集合发送给上线用户
System.Threading.Thread.Sleep(10);
this.sendMsgToOneUser(23, buf, e.IP, e.Port);//将在线用户集合发送给上线用户
///连续两次发送
}
}
this.sendLoginUserToUsers(user);//发送登录用户的在线信息资料给所有在线用户,通知其有新用户登录
//this.WirteLog("用户" + userID + "登录成功!" + e.IP.ToString() + ":" + e.Port.ToString());
}
}
else
{
byte[] buf = new byte[1];
buf[0] = 0;
this.sendMsgToOneUser(0, buf, e.IP, e.Port);//告诉用户密码错误
this.WirteLog("用户" + userID + "密码错误!" + e.IP.ToString() + ":" + e.Port.ToString());
}
}
#endregion
#region 发送部门版本号给用户
/// <summary>
/// 发送部门版本号给用户
/// </summary>
/// <param name="ip">用户IP</param>
/// <param name="port">用户端口</param>
private void sendDepVersionToUser(System.Net.IPAddress ip, int port)
{
byte[] buf = IMLibrary.Serializers.ObjToByte(this.VersionDepAndUser );
this.sendMsgToOneUser(5, buf, ip, port);//发送部门版本号给登录用户并告之登录 成功
//this.WirteLog("发送部门版本号给登录用户并告之登录成功"+ buf.Length.ToString());
}
/// <summary>
/// 发送部门版本号给用户
/// </summary>
/// <param name="userID">用户ID</param>
private void sendDepVersionToUser(string userID)
{
IMLibrary.UserInfo user = this.findUser(userID);
if (user != null)
{
byte[] buf = IMLibrary.Serializers.ObjToByte(this.VersionDepAndUser );
this.sendMsgToOneUser(5, buf, user.IP, user.Port);//发送部门版本号给用户
}
}
#endregion
#region 发送部门数给用户
/// <summary>
/// 发送部门数给用户
/// </summary>
/// <param name="ip">用户IP</param>
/// <param name="port">用户端口</param>
private void sendDepCoutToUser(System.Net.IPAddress ip,int port)
{
IMLibrary.ServerMsg msg = new IMLibrary.ServerMsg(0,IMLibrary.TextEncoder.intToBytes(this.deps.Count));
byte[] buf = IMLibrary.Serializers.ObjToByte (msg);
this.sendMsgToOneUser(7, buf, ip, port);//发送部门数给用户
}
/// <summary>
/// 发送部门数给用户
/// </summary>
/// <param name="userID">用户ID</param>
//private void sendDepCoutToUser(string userID)
//{
// IMLibrary.UserInfo user=this.findUser(userID);
// if (user != null)
// {
// IMLibrary.ServerMsg msg = new IMLibrary.ServerMsg(0,null,IMLibrary.TextEncoder.intToBytes(this.deps.Count));
// byte[] buf = IMLibrary.Serializers.ObjToByte(msg);
// this.sendMsgToOneUser(7, buf, user.IP, user.Port);//发送部门数给用户
// }
//}
#endregion
#region 更改用户在线信息(集合中更改)
/// <summary>
/// 更新用户在线信息
/// </summary>
/// <param name="userID">用户ID</param>
/// <param name="ip">用户IP</param>
/// <param name="port">用户端口</param>
/// <param name="state">用户在线状态</param>
/// <returns>返回更改是否成功或其它信息</returns>
private void UpdateUserInfo(string userID, System.Net.IPAddress ip, int port, byte state)
{
IMLibrary.UserInfo user = findUser(userID);
if (user != null)
{
user.IP = ip;
user.Port = port;
user.State = state;
user.tempState = state;
}
}
private void UpdateUserInfo(IMLibrary.UserInfo user, System.Net.IPAddress ip, int port, byte state)
{
if (user != null)
{
user.IP = ip;
user.Port = port;
user.State = state;
user.tempState = state;
}
}
#endregion
#region 在用户集合中查找用户
/// <summary>
/// 在用户集合中查找用户
/// </summary>
/// <param name="userID">用户ID</param>
/// <returns>返回用户信息</returns>
private IMLibrary.UserInfo findUser(string userID)
{
IMLibrary.UserInfo user=null ;
for (uint index = 1; index < systemUsers.Length;index ++ )
if (systemUsers[index].UserID.ToLower() == userID.ToLower())
return systemUsers[index];
return user;
}
#endregion
#region 发送消息给一个用户sendMsgToOneUser(Byte msgInfo ,byte[] msgContent, System.Net.IPAddress Ip, int Port)
/// <summary>
/// 发送消息给一个用户
/// </summary>
/// <param name="msgInfo">消息类型</param>
/// <param name="msgContent">消息内容</param>
/// <param name="Ip">接收者IP</param>
/// <param name="Port">接收者端口</param>
public void sendMsgToOneUser(Byte msgInfo ,byte[] msgContent, System.Net.IPAddress Ip, int Port)//给一个用户发送消息
{
byte[] buf = new byte[msgContent.Length + 2];
buf[0] = 255;//合法用户标识
buf[1] = msgInfo;//消息类型
Buffer.BlockCopy(msgContent, 0, buf, 2, msgContent.Length);
IMLibrary.SockUDP sockTemp = new SockUDP();
sockTemp.Send(Ip, Port, buf);
sockTemp.Dispose();
}
public void sendMsgToOneUser(byte[] msgContent, System.Net.IPAddress Ip, int Port)//给一个用户发送消息
{
IMLibrary.SockUDP sockTemp = new SockUDP();
sockTemp.Send(Ip, Port, msgContent);
sockTemp.Dispose();
}
#endregion
#region 发送登录用户的在线信息资料给所有在线用户,通知其有新用户登录
/// <summary>
/// 发送登录用户的在线信息资料给所有在线用户,通知其有新用户登录
/// </summary>
/// <param name="Uses">要发送的用户信息</param>
private void sendLoginUserToUsers(IMLibrary.UserInfo user)
{
byte[] buf = IMLibrary.Serializers.ObjToByte(user);
for (uint index = 1; index < systemUsers.Length; index++)
if (systemUsers[index].State != 0)
{
this.sendMsgToOneUser(9, buf, systemUsers[index].IP, systemUsers[index].Port);
System.Threading.Thread.Sleep(10);
}
}
#endregion
#region 将消息写入日志文件 WirteLog(string str)
/// <summary>
/// LanMsg写日志函数
/// </summary>
/// <param name="str">要写入的日志内容字符串</param>
private void WirteLog(string str)
{
FileStream fs = new FileStream(AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "log.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter _streamWriter = new StreamWriter(fs);
_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
_streamWriter.WriteLine(str + " " + DateTime.Now.ToString() + "\n");
_streamWriter.Flush();
_streamWriter.Close();
fs.Close();
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -