📄 formaccess.cs
字号:
/// 显示节点信息
/// </summary>
static void SetTreeViewNodeShow()
{
int onlineUserCount = 0;
int allUserCount = 0;
int subDepCount = 0;
exUser user;
foreach (exDepartment dep in deps)
{
onlineUserCount = 0;
allUserCount = 0;
subDepCount = 0;
foreach (TreeNode node in dep.Node.Nodes)
{
if (node.Tag.ToString() != "1")
subDepCount++;
else
{
user = FormAccess.findUser(node.Name);
if (user != null && user.State != 0)
onlineUserCount++;
allUserCount++;
}
}
//if (allUserCount == 0)
// dep.Node.Text = dep.Node.ToolTipText.ToString() ;//+ "(" + subDepCount.ToString() + ")""(" + onlineUserCount.ToString() + "/" + allUserCount.ToString() + ")"+ + "";
//else
dep.Node.Text = dep.Node.ToolTipText.ToString() + "(" + onlineUserCount.ToString() + "/" + allUserCount.ToString() + ")";
}
}
#endregion
#region 将所有用户的在线信息清除
/// <summary>
/// 将所有用户的在线信息清除
/// </summary>
public static void setUsersNoOnline()
{
FormAccess.selfInfo.State = 0;//将自己的状态设置为0设置为离线
foreach (exUser user in FormAccess.Users)
{
user.State = 0;
user.IP = System.Net.IPAddress.Parse("127.0.0.1");
user.MTU = 750;
}
}
#endregion
#region 产生新发送消息窗口
/// <summary>
/// 产生新发送消息窗口
/// </summary>
/// <param name="userId">用户id</param>
public static Form newSendMsgForm(string userId)
{
Form f = findForm (userId);
if (f == null)
{
exUser user = findUser(userId );
if (user != null)
{
f = new FormSendMsg();
f.Tag = userId;
f.Text = "与 " + user.userName + "(" + user.UserID + ") 对话";
sendMsgForms.add(f);
}
}
f.Show();
f.Activate();
return f;
}
#endregion
#region 发送消息到服务器sendMsgToServer
/// <summary>
/// 发送消息到服务器
/// </summary>
/// <param name="msgInfo">消息类型</param>
/// <param name="msg">消息对象</param>
public static void sendMsgToServer(Byte msgInfo, IMLibrary.ServerMsg msg)
{
byte[] compresseddata = IMLibrary.Serializers.ObjToByte(msg);
byte[] buf = new byte[compresseddata.Length + 2];
buf[0] = 255;//合法用户标识
buf[1] = msgInfo;//消息类型
Buffer.BlockCopy(compresseddata, 0, buf, 2, compresseddata.Length);
sockUDP.Send( ServerIP, ServerPort, buf);
}
/// <summary>
/// 发送消息到服务器
/// </summary>
/// <param name="msgInfo">消息类型</param>
/// <param name="msg">消息对象</param>
public static void sendMsgToServer(Byte msgInfo, IMLibrary.serverTransmitMsg msg)
{
byte[] compresseddata = IMLibrary.Serializers.ObjToByte(msg);
byte[] buf = new byte[compresseddata.Length + 2];
buf[0] = 255;//合法用户标识
buf[1] = msgInfo;//消息类型
Buffer.BlockCopy(compresseddata, 0, buf, 2, compresseddata.Length);
sockUDP.Send(ServerIP, ServerPort, buf);
}
/// <summary>
/// 发送空数据给服务器实现UDP端口映射
/// </summary>
public static void sendMsgToServer()
{
byte[] buf = new byte[1];
sockUDP.Send(ServerIP, ServerPort, buf);
}
#endregion
#region 发送消息给一个用户sendMsgToOneUser
/// <summary>
/// 发送消息给一个用户
/// </summary>
/// <param name="msgInfo">消息类型</param>
/// <param name="msg">消息对象</param>
/// <param name="Ip">消息接收者IP地址</param>
/// <param name="Port">消息接收者端口</param>
public static void sendMsgToOneUser(Byte msgInfo,byte[] data, System.Net.IPAddress Ip, int Port)//发送消息到一个用户
{
byte[] buf = new byte[data.Length + 2];
buf[0] = 255;//合法用户标识
buf[1] = msgInfo;//消息类型
Buffer.BlockCopy(data, 0, buf, 2, data.Length);
sockUDP.Send(Ip, Port, buf);
}
/// <summary>
/// 发送消息给一个用户
/// </summary>
/// <param name="msgInfo">消息类型</param>
/// <param name="data">消息内容</param>
/// <param name="Ip">接收者IP</param>
/// <param name="Port">接收者端口</param>
public static void sendMsgToOneUser(Byte msgInfo, byte[] data, exUser user)
{
byte[] buf = new byte[data.Length + 2];
buf[0] = 255;//合法用户标识
buf[1] = msgInfo;//消息类型
Buffer.BlockCopy(data, 0, buf, 2, data.Length);
if (user.isDirectCon)//如果直联,则消息直接发送
sockUDP.Send(user.IP, user.Port, buf);
else//否则消息由服务器转发
{
IMLibrary.serverTransmitMsg stMsg = new serverTransmitMsg(FormAccess.selfInfo.UserID, user.UserID, buf);
sendMsgToServer(7, stMsg);
}
}
/// <summary>
/// 发送消息给一个用户
/// </summary>
/// <param name="msgInfo">消息类型</param>
/// <param name="msg">消息对象</param>
/// <param name="user">消息接收者</param>
public static void sendMsgToOneUser(Byte msgInfo, IMLibrary.clientMsg msg,exUser user)
{
msg.sendUserId = selfInfo.UserID;//发送数据者为自己
byte[] compresseddata = IMLibrary.Serializers.ObjToByte(msg);
byte[] buf = new byte[compresseddata.Length + 2];
buf[0] = 255;//合法用户标识
buf[1] = msgInfo;//消息类型
Buffer.BlockCopy(compresseddata, 0, buf, 2, compresseddata.Length);
if (user.isDirectCon)//如果直联,则消息直接发送
sockUDP.Send(user.IP, user.Port, buf);
else//否则消息由服务器转发
{
IMLibrary.serverTransmitMsg stMsg = new serverTransmitMsg(FormAccess.selfInfo.UserID, user.UserID, buf);
sendMsgToServer(7, stMsg);
}
}
#endregion
#region 慢速算法打UDP洞
/// <summary>
/// 慢速算法实现向在线用户打UDP洞
/// </summary>
/// <param name="isToAllUser">是否向所有用户打洞</param>
/// <param name="User">如果是向一个用户打洞,则提供用户信息</param>
public static void udpPenToUser(bool isToAllUser, exUser User)
{
//////向所有用户UDP打洞
byte[] buf = IMLibrary.TextEncoder.textToBytes(FormAccess.selfInfo.UserID + "|");
byte[] buf0 = new byte[800];
byte[] buf1 = new byte[1200];
byte[] buf2 = new byte[20000];
byte[] buf3 = new byte[40000];
Buffer.BlockCopy(buf, 0, buf0, 0, buf.Length);
Buffer.BlockCopy(buf, 0, buf1, 0, buf.Length);
Buffer.BlockCopy(buf, 0, buf2, 0, buf.Length);
Buffer.BlockCopy(buf, 0, buf3, 0, buf.Length);
if (isToAllUser)
foreach (exUser user in FormAccess.Users)
{
if (user.State == 0 || user.UserID==FormAccess.selfInfo.UserID ) return;//如果不在线或是自己就不打洞
FormAccess.sendMsgToOneUser(16, buf0, user.IP, user.Port);//向一个用户小包(网络非正常)UDP打洞
System.Threading.Thread.Sleep(10);
FormAccess.sendMsgToOneUser(16, buf1, user.IP, user.Port);//向一个用户中包(网络正常)UDP打洞
System.Threading.Thread.Sleep(10);
FormAccess.sendMsgToOneUser(16, buf2, user.IP, user.Port);//向一个用户大包(网络良好,处于局域网)UDP打洞
System.Threading.Thread.Sleep(10);
FormAccess.sendMsgToOneUser(16, buf3, user.IP, user.Port);//向一个用户大包(网络良好,处于局域网或本机)UDP打洞
}
else
{
if (User == null || User.UserID == FormAccess.selfInfo.UserID) return;
FormAccess.sendMsgToOneUser(16, buf0, User.IP, User.Port);//向一个用户小包(网络非正常)UDP打洞
System.Threading.Thread.Sleep(10);
FormAccess.sendMsgToOneUser(16, buf1, User.IP, User.Port);//向一个用户中包(网络正常)UDP打洞
System.Threading.Thread.Sleep(10);
FormAccess.sendMsgToOneUser(16, buf2, User.IP, User.Port);//向一个用户大包(网络良好,处于局域网)UDP打洞
System.Threading.Thread.Sleep(10);
FormAccess.sendMsgToOneUser(16, buf3, User.IP, User.Port);//向一个用户大包(网络良好,处于局域网或本机)UDP打洞
}
}
#endregion
#region 给所有在线用户发送消息
/// <summary>
/// 给所有在线用户发送消息
/// </summary>
/// <param name="msgInfo">消息类型</param>
/// <param name="msg">消息内容</param>
public static void sendMsgToAllUser(Byte msgInfo, byte[] msg)
{
byte[] buf = new byte[msg.Length + 2];
buf[0] = 255;//合法用户标识
buf[1] = msgInfo;//消息类型
Buffer.BlockCopy( msg, 0, buf, 2, msg.Length);
foreach (exUser user in Users)
if(user.State!=0)
sockUDP.Send(user.IP , user.Port , buf);
}
#endregion
#region 给所有选中用户发送消息
/// <summary>
/// 给所有选中用户发送消息
/// </summary>
/// <param name="msgInfo">消息类型</param>
/// <param name="msg">消息内容</param>
public static void sendMsgToAllCheckUser(Byte msgInfo, byte[] msg)
{
byte[] buf = new byte[msg.Length + 2];
buf[0] = 255;//合法用户标识
buf[1] = msgInfo;//消息类型
Buffer.BlockCopy(msg, 0, buf, 2, msg.Length);
foreach (exUser user in Users)
if (user.Node.Checked && user.State != 0)
sockUDP.Send(user.IP, user.Port, buf);
}
#endregion
# region 打开公共窗口
/// <summary>
/// 打开公共窗口
/// </summary>
/// <param name="tag">公共窗口tag</param>
public static Form showPublicForm(string tag)
{
Form f = FormAccess.findForm(tag);
if (f == null)
{
switch (tag)
{
case "FormRecordMsgMisg":
f = new FormRecordMsgMisg();
break;
case "FormSendMsgGroup":
f = new FormSendMsgGroup();
break;
case "FormAppSet":
f = new FormAppSet();
break;
case "AboutBox":
f = new AboutBox();
break;
}
f.Tag = tag;
FormAccess.sendMsgForms.add(f);
}
f.Show();
f.Activate();
return f;
}
#endregion
#region 计算时间差
/// <summary>
/// 计算时间差
/// </summary>
/// <param name="DateTime1">开始时间</param>
/// <param name="DateTime2">结束时间</param>
/// <returns></returns>
public static int DateDiff(DateTime DateTime1, DateTime DateTime2)
{
int dateDiff = 0;
try
{
TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);
TimeSpan ts2 = new TimeSpan(DateTime2.Ticks);
dateDiff = ts2.Subtract(ts1).Seconds;
}
catch
{ }
return dateDiff;
}
#endregion
#region 播放声音
/// <summary>
/// 播放声音
/// </summary>
/// <param name="file">要播放的文件名及路径</param>
public static void palySound(string file)
{
IMLibrary.AV.SoundPlayer _palySound = new IMLibrary.AV.SoundPlayer();
_palySound.Play(file);
}
public static void palySound(System.IO.Stream stream)
{
IMLibrary.AV.SoundPlayer _palySound = new IMLibrary.AV.SoundPlayer();
_palySound.play(stream);
}
#endregion
#region 将程序添加到启动项
/// <summary>
/// 注册表操作,将程序添加到启动项
/// </summary>
public static void SetRegistryKey()
{
try
{
Microsoft.Win32.RegistryKey Reg;
Reg = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true);
Reg.SetValue("LanMsg", Application.ExecutablePath);
}
catch { }
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -