📄 formmain.cs
字号:
ushort mtu=Convert.ToUInt16 (userUdpPenInfo[1]);
if(user.MTU < mtu)
user.MTU=mtu;
}
catch(Exception x)
{
MessageBox.Show(x.Message + x.Source);
}
//MessageBox.Show("用户UDP打洞成功。MTU值为:"+ user.MTU.ToString() );
}
#endregion
#region 对方已经取消视频对话
private void onCancelAV(DataArrivalEventArgs e)
{
IMLibrary.clientMsg msg = IMLibrary.Serializers.ByteToObj (e.Data) as IMLibrary.clientMsg ;
exUser user = FormAccess.findUser(msg.sendUserId );
if (user == null) return;
Form f = FormAccess.findForm(user.UserID);
if (f == null) return;
(f as FormSendMsg).CancelAV ( );
f.Show();
f.Activate();
}
#endregion
#region 对方告诉可以开始视频
private void onBeginAV(DataArrivalEventArgs e)
{
exUser user = FormAccess.findUser(IMLibrary.TextEncoder.bytesToText(e.Data));
if (user == null) return;
Form f = FormAccess.findForm(user.UserID);
if (f == null) return;
(f as FormSendMsg).BeginAV (e.IP, e.Port);
f.Show();
f.Activate();
}
#endregion
#region 处理对方请求的视频对话
/// <summary>
/// 处理对方请求的视频对话
/// </summary>
/// <param name="e"></param>
private void onAVRequest(DataArrivalEventArgs e)
{
exUser user = FormAccess.findUser(IMLibrary.TextEncoder.bytesToText(e.Data));
if (user == null) return;
Form f = FormAccess.findForm(user.UserID );
if (f == null)
{
f = new FormSendMsg();
f.Tag = user.UserID ;
f.Text = "与 " + user.userName + "(" + user.UserID + ") 对话";
FormAccess.sendMsgForms.add(f);
IMLibrary.TaskbarNotifier tbn = new TaskbarNotifier(1);
tbn.Show("提示", "用户" + user.userName + "(" + user.UserID + ")请求视频对话。", 500, 3000, 500);
}
(f as FormSendMsg).AVrequest(e.IP ,e.Port);
f.Show();
f.Activate();
}
#endregion
#region 处理群发通知消息
/// <summary>
/// 处理群发通知消息
/// </summary>
/// <param name="e"></param>
private void onGroupMsg(DataArrivalEventArgs e)
{
IMLibrary.clientMsg msg;
try
{
msg = IMLibrary.Serializers.ByteToObj(e.Data) as clientMsg;
}
catch { return;}//抛掉非法数据
if (msg == null) return;
string msgContent = msg.msgContent;
exUser user = FormAccess.findUser(msg.sendUserId);
if (user != null)
{
dataAccess.addMsgToDB(msgContent, user.UserID, FormAccess.selfInfo.UserID, "1", System.DateTime.Now.ToString(), "", false);
msgContent += "\n发布:" + user.userName + "(" + user.UserID + ") " + System.DateTime.Now.ToString();
}
FormNotice f = new FormNotice();
f.RTBNoticeContent.AppendText(msgContent);
f.Show();
f.Activate();
IMLibrary.TaskbarNotifier tbn = new TaskbarNotifier(3);
tbn.Show("提示", "收到 "+ user.userName + "(" + user.UserID + ") 发送的群发消息。", 500, 3000, 500);
}
#endregion
#region 用户桌面截图发送请求
/// <summary>
/// 用户桌面截图发送请求
/// </summary>
/// <param name="e"></param>
private void onUserImageSendRequest(DataArrivalEventArgs e)
{
string[] fileInfo = IMLibrary.TextEncoder.bytesToText(e.Data).Split('|');
if (fileInfo.Length < 4) return;//抛掉非法数据
Form f = FormAccess.findForm(fileInfo[0]);
if (f == null)//如果用户对话窗口已经不在,则发送消息告诉对方停止传输图片
{
return;
}
(f as FormSendMsg).ImageTransfers(false, fileInfo[1], fileInfo[1], fileInfo[2], Convert.ToInt32(fileInfo[3]),e.IP, e.Port);
f.Show();
f.Activate();
}
#endregion
#region 用户发送文件请求
/// <summary>
/// 用户发送文件请求
/// </summary>
/// <param name="e"></param>
private void onUserFileSendRequest(DataArrivalEventArgs e)
{
string[] fileInfo = IMLibrary.TextEncoder.bytesToText(e.Data).Split('|');
if(fileInfo.Length<4)return;//抛掉非法数据
Form f = FormAccess.findForm(fileInfo[0]);
if (f == null)
{
f = new FormSendMsg();
exUser user=FormAccess.findUser(fileInfo[0]);
if (user != null)
{
f.Text = "与 " + user.userName + "(" + user.UserID + ") 对话";
IMLibrary.TaskbarNotifier tbn = new TaskbarNotifier(1);
tbn.Show("提示", user.userName + "(" + user.UserID + ")要发送文件:" + fileInfo[1] + " 给您,请接收或取消。", 500, 3000, 500);
}
f.Tag = fileInfo[0];
FormAccess.sendMsgForms.add(f);
}
(f as FormSendMsg).FileTransfers(false, fileInfo[1], fileInfo[1], fileInfo[2], Convert.ToInt32(fileInfo[3]), e.IP, e.Port);
f.Show();
f.Activate();
}
#endregion
#region 用户已在别处登录
/// <summary>
/// 用户已在别处登录
/// </summary>
private void onUserElseLogin()
{
this.timerCheckOnlinState.Enabled = false;//停止检测联机状态
FormAccess.setUsersNoOnline();
MessageBox.Show("当前用户 "+FormAccess.selfInfo.userName +"("+ FormAccess.selfInfo.UserID +") 已经在别处登录,您已被迫离线。","提示",MessageBoxButtons.OK,MessageBoxIcon.Information );
}
#endregion
#region 用户离线
/// <summary>
/// 用户离线
/// </summary>
/// <param name="e"></param>
private void onUserIsNotOnline(DataArrivalEventArgs e)
{
exUser user = FormAccess.findUser(IMLibrary.TextEncoder.bytesToText(e.Data) );
if (user != null)
user.State = 0;
}
#endregion
#region 用户上线事件
/// <summary>
/// 用户上线事件
/// </summary>
/// <param name="e"></param>
private void onUserOnline(DataArrivalEventArgs e)
{
IMLibrary.UserInfo user = IMLibrary.Serializers.ByteToObj(e.Data) as IMLibrary.UserInfo;
if (user == null) return;//抛掉非法数据
exUser User = FormAccess.findUser(user.UserID);
if (User == null) return;//抛掉非法数据
User.ID = user.ID;//用户在服务器上的索引
User.userName = user.userName;//用户名字
User.State = user.State;//用户在线状态
User.IP = user.IP;//用户IP
User.Port = user.Port;//用户端口
User.MTU = 550; //清掉原来的MTU值,重新打洞算值。min =576
if (User.UserID == FormAccess.selfInfo.UserID)
{
FormAccess.selfInfo.userName = User.userName;
FormAccess.selfInfo.ID = User.ID;
FormAccess.selfInfo.IP = User.IP;
FormAccess.selfInfo.Port = User.Port;
}
else////向刚上线的用户UDP打洞
{
FormAccess.udpPenToUser(false, User);//慢速算法实现向用户UDP打洞
}
}
#endregion
#region 收到用户对话消息
/// <summary>
/// 收到用户对话消息
/// </summary>
/// <param name="e"></param>
private void onUserReceiveMsg(DataArrivalEventArgs e)
{
IMLibrary.clientMsg msg;
try
{
msg = IMLibrary.Serializers.ByteToObj(e.Data) as IMLibrary.clientMsg;
}
catch { return; }//抛掉非法数据
if (msg == null) return;
exUser user = FormAccess.findUser(msg.sendUserId );
if (user == null) return;//抛掉非法数据
Form f = FormAccess.findForm(msg.sendUserId);
if (f == null)
{
f = new FormSendMsg();
f.Tag = msg.sendUserId;
if (user != null) f.Text = "与 " + user.userName + "(" + user.UserID + ") 对话";
FormAccess.sendMsgForms.add(f);
IMLibrary.TaskbarNotifier tbn = new TaskbarNotifier(1);
tbn.Show("提示", "收到"+user.userName +"(" + user.UserID +")发来的新消息", 500, 3000, 500);
}
(f as FormSendMsg).MsgToRichTextBox(msg,false);
f.Show();
FormAccess.palySound(FormAccess.resourceManager.GetStream("msg"));///播放声音
f.Activate();
}
#endregion
#region 用户收到消息并回复
/// <summary>
/// 用户收到消息并回复
/// </summary>
/// <param name="e"></param>
private void onUserReceiveMsgReturn(DataArrivalEventArgs e)
{
IMLibrary.clientMsg msg;
try
{
msg = IMLibrary.Serializers.ByteToObj(e.Data) as IMLibrary.clientMsg;
}
catch { return; }//抛掉非法数据
if (msg == null) return;
exUser user = FormAccess.findUser(msg.sendUserId);//查找用户
if (user != null)
{
user.SendIsSuccess = true;//标记刚才发送的消息用户已经收到
}
}
#endregion
#region 服务器返回的部分在线用户的信息
/// <summary>
/// 服务器返回的部分在线用户的信息
/// </summary>
/// <param name="e"></param>
private void onGetOnlineUserCollections(DataArrivalEventArgs e)
{
IMLibrary.UserCollections tempUsers;
try
{
tempUsers = IMLibrary.Serializers.ByteToObj(e.Data) as UserCollections;//获得用户集合
}
catch { return; }// 非法数据则退出
foreach (UserInfo tempUser in tempUsers)
{
exUser User = FormAccess.findUser(tempUser.UserID);
if (User != null)//如果用户在集合里查找到
{
User.ID = tempUser.ID;
User.userName = tempUser.userName;
User.State = tempUser.State;
User.IP = tempUser.IP;
User.Port = tempUser.Port;
if (User.UserID == FormAccess.selfInfo.UserID)
{
FormAccess.selfInfo.userName = User.userName;
FormAccess.selfInfo.ID = User.ID;
FormAccess.selfInfo.IP = User.IP;
FormAccess.selfInfo.Port = User.Port;
}
else////向刚上线的用户UDP打洞
{
FormAccess.udpPenToUser(false, User);//慢速算法实现向用户UDP打洞
}
}
}
}
#endregion
#region 获得服务器返回的部分用户信息
/// <summary>
/// 获得服务器返回的部分用户信息
/// </summary>
/// <param name="e"></param>
private void onGetUserCollections(DataArrivalEventArgs e)
{
IMLibrary.UserCollections tempUsers;
try
{
tempUsers = IMLibrary.Serializers.ByteToObj(e.Data) as UserCollections;//获得用户集合
}
catch { return; }// 非法数据则退出
foreach (UserInfo tempUser in tempUsers)
{
exUser tUser = FormAccess.findUser(tempUser.UserID);
if (tempUser.UserID == FormAccess.selfInfo.UserID)
{
FormAccess.selfInfo.ID = tempUser.ID;//获得自己在服务器上的索引
FormAccess.selfInfo.IP = tempUser.IP;//获得自己的公网IP
FormAccess.selfInfo.Port = tempUser.Port;//获得自己的公网UDP端口
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -