实例介绍
【实例截图】

主要源码在上图红框的文件夹中
【核心代码】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MyVideo;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using MyTool;
using MyClass;
using System.IO;
using EmotionTest;
using CSharpWin;
namespace ClientUDP
{
public partial class btnExit : Form
{
/// <summary>
/// UDP接收端 用来接收 服务器 和 客户端的消息
/// </summary>
private UdpClient udpClient;
/// <summary>
/// serverIP 主机IP,remotePoint目标主机
/// </summary>
IPEndPoint serverIP, remotePoint;
/// <summary>
/// 视频设备
/// </summary>
public Video video;
/// <summary>
/// 标识视频设备是否打开
/// </summary>
public bool videoState = false;
//Thread threadVideo;
/// <summary>
/// 线程
/// </summary>
BackgroundWorker bw;
bool thraadFlag = false;
/// <summary>
///videoImage 本地图像,receiveImage远端图像
/// </summary>
Image videoImage,receiveImage;
/// <summary>
/// 本地用户
/// </summary>
UserInfo localUser;
/// <summary>
/// 用户列表
/// </summary>
Dictionary<string, UserInfo> listUserInfo = new Dictionary<string, UserInfo>();
/// <summary>
/// 显示消息委托
/// </summary>
/// <param name="mm">消息对象</param>
delegate void MyDelegateShowMessage(MyMessage mm);
/// <summary>
/// 自定义委托 用来委托执行方法
/// </summary>
delegate void MyDelegate();
public btnExit()
{
InitializeComponent();
//加载皮肤
skin.SkinFile = "Calmness.ssk";
//初始化视频设备
video = new Video(picMy.Handle, picMy.Left, picMy.Top, picMy.Width, (short)picMy.Height);
}
/// <summary>
/// 开启视频
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpenVideo_Click(object sender, EventArgs e)
{
if (videoState == false)
{
video.opVideo();
//标识视频已打开
videoState = true;
}
}
/// <summary>
/// 显示用户列表到ListBox
/// </summary>
public void GetUser()
{
listUser.Items.Clear();
foreach (UserInfo u in listUserInfo.Values)
{
listUser.Items.Add(u.Name);
}
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
Run();
}
public void ShowVideo()
{
picF.Image = this.receiveImage;
}
/// <summary>
/// 线程启动方法
/// </summary>
///
List<XMessage> xmRList = new List<XMessage>();
int rArrayLength = 0;
int rArrayCountSum = 0;
public void Run()
{
try
{
byte[] data;
while (!thraadFlag)
{
data = udpClient.Receive(ref remotePoint);
SuperSerializeHelper super = new SuperSerializeHelper();
object obj = super.Deserialize(data);
if (obj != null)
{
Type objType = obj.GetType();
if (objType == typeof(XMessage))
{
XMessage xm = (XMessage)obj;
xmRList.Add(xm);
}
if (objType == typeof(XXMessageEND))
{
XXMessageEND rEnd = (XXMessageEND)obj;
rArrayLength = rEnd.ArrayLength;
rArrayCountSum = rEnd.ArrryCountSum;
try
{
this.merge(xmRList);
xmRList = new List<XMessage>();
}
catch (Exception ex)
{
//timerSendVideo.Enabled = true;
this.Invoke(new MyDelegate(StartSend));
Console.WriteLine(ex.ToString() "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
}
}
else if(objType == typeof(UserInfo))
{
UserInfo rUser = (UserInfo)obj;
if (listUserInfo.Keys.Contains(rUser.Name))
{
listUserInfo.Remove(rUser.Name);
}
listUserInfo.Add(rUser.Name, rUser);
listUser.Invoke(new MyDelegate(GetUser));
}
else if (objType == typeof(MyMessage))
{
MyMessage mm = (MyMessage)obj;
txtRStr.Invoke(new MyDelegateShowMessage(showMessageStr),mm);
}
}
//udpClient1.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
/// <summary>
/// 组装视频图像方法
/// </summary>
/// <param name="listxm"></param>
public void merge(List<XMessage> listxm)
{
//组装
byte[] buff = null;
int num = 0;
int arrayLength = 0;
int arratSunNum = 0;
foreach (XMessage tx in listxm)
{
if (tx.cmd == Cmd.Begin)
{
arrayLength = tx.detaIndex;
}
else if (tx.cmd == Cmd.End)
{
arratSunNum = tx.detaIndex;
}
}
//buff = new byte[arrayLength];
buff = new byte[rArrayLength];
//XMessage[] xmar = new XMessage[arratSunNum 1];
XMessage[] xmar = new XMessage[rArrayCountSum];
foreach (XMessage tx in listxm)
{
if (tx.cmd == Cmd.Begin)
{
xmar[0] = new XMessage();
xmar[0].data = tx.data;
}
else if (tx.cmd == Cmd.Sending)
{
try
{
xmar[tx.detaIndex] = new XMessage();
xmar[tx.detaIndex].data = tx.data;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
throw ex;
}
}
else
{
xmar[arratSunNum] = new XMessage();
xmar[arratSunNum].data = tx.data;
}
}
for (int i = 0; i < xmar.Length; i )
{
try
{
Array.Copy(xmar[i].data, 0, buff, num, xmar[i].data.Length);
num = xmar[i].data.Length;
}
catch (Exception ex)
{
throw ex;
Console.WriteLine(ex.ToString());
}
}
SuperSerializeHelper super = new SuperSerializeHelper();
object obj = super.Deserialize(buff);
if (obj !=null)
{
Type objType = obj.GetType();
if (objType == typeof(VideoMessage))
{
VideoMessage vm = (VideoMessage)obj;
if (vm.VideoImage != null)
{
MemoryStream ms = new MemoryStream(vm.VideoImage);
this.receiveImage = Image.FromStream(ms);
picF.Invoke(new MyDelegate(ShowVideo));
Console.WriteLine("r ok");
}
}
}
}
private void btnStart_Click(object sender, EventArgs e)
{
StartSend();
//SendVideo();
//timer1.Enabled = true;
}
private void StartSend()
{
try
{
if (txtFName.Text.Length != 0)
{
string strName = txtFName.Text;
UserInfo fUser = listUserInfo[strName];
remotePoint = fUser.Ip;
timerSendVideo.Enabled = true;
//辅助发送视频Timer控件
timer1.Enabled = true;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
private void timerSendVideo_Tick(object sender, EventArgs e)
{
if (txtFName.Text.Length != 0)
{
string strName = txtFName.Text;
UserInfo fUser = listUserInfo[strName];
remotePoint = fUser.Ip;
SendVideo();
}
}
private void SendVideo()
{
MemoryStream ms = new MemoryStream();
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
try
{
videoImage = video.CatchVideo();
Bitmap bmp = new Bitmap(videoImage);
CompressImage ci = new CompressImage();
Bitmap newBmp = ci.KiResizeImage(bmp, 200, 153);
newBmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
//videoImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
//CompressImage ci = new CompressImage();
//ci.Compress_Image(ref ms);
VideoMessage vm = new VideoMessage();
vm.VideoImage = ms.ToArray();
SuperSerializeHelper super = new SuperSerializeHelper();
byte[] data = super.Serialize(vm);
//拆分
List<XMessage> list = new List<XMessage>();
int n = 0;
int index = 0;
while (n <= data.Length)
{
int len = Math.Min(512, data.Length - n);
byte[] temp = new byte[len];
Array.Copy(data, n, temp, 0, len);
XMessage xm = new XMessage();
if (index == 0)
{
xm.cmd = Cmd.Begin;
xm.detaIndex = data.Length;
xm.data = temp;
}
else if ((n len) == data.Length)
{
xm.cmd = Cmd.End;
xm.detaIndex = index;
xm.data = temp;
}
else
{
xm.cmd = Cmd.Sending;
xm.detaIndex = index;
xm.data = temp;
}
list.Add(xm);
n = 512;
index ;
}
//发送
foreach (XMessage tx in list)
{
byte[] temp = super.Serialize(tx);
udpClient.Send(temp, temp.Length, remotePoint);
}
XXMessageEND end = new XXMessageEND();
end.ArrayLength = data.Length;
end.ArrryCountSum = index;
byte[] endData = super.Serialize(end);
udpClient.Send(endData, endData.Length, remotePoint);
////组装
//byte[] buff = null;
//int num = 0;
//int arrayLength = 0;
//int arratSunNum = 0;
//foreach(XMessage tx in list)
//{
// if (tx.cmd == Cmd.Begin)
// {
// arrayLength = tx.detaIndex;
// }else if(tx.cmd == Cmd.End)
// {
// arratSunNum = tx.detaIndex;
// }
//}
//buff = new byte[arrayLength];
//XMessage[] xmar = new XMessage[arratSunNum 1];
//foreach (XMessage tx in list)
//{
// if (tx.cmd == Cmd.Begin)
// {
// xmar[0] = new XMessage();
// xmar[0].data = tx.data;
// }
// else if (tx.cmd == Cmd.Sending)
// {
// xmar[tx.detaIndex] = new XMessage();
// xmar[tx.detaIndex].data = tx.data;
// }
// else
// {
// xmar[arratSunNum] = new XMessage();
// xmar[arratSunNum].data = tx.data;
// }
//}
//for (int i = 0;i<xmar.Length ;i )
//{
// Array.Copy(xmar[i].data, 0, buff, num, xmar[i].data.Length);
// num = xmar[i].data.Length;
//}
//object obj = super.Deserialize(buff);
Console.WriteLine("send to " remotePoint.ToString());
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
ms.Close();
s.Close();
}
}
private void ClientForm_FormClosed(object sender, FormClosedEventArgs e)
{
thraadFlag = true;
//this.threadVideo.Abort();
if (videoState)
{
video.CloVideo();
}
}
private void txtIP_TextChanged(object sender, EventArgs e)
{
}
private void btnStop_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
timerSendVideo.Enabled = false;
}
private void btnCloseVideo_Click(object sender, EventArgs e)
{
if (videoState == true)
{
video.CloVideo();
videoState = false;
timer1.Enabled = false;
}
timer1.Enabled = false;
timerSendVideo.Enabled = false;
}
/// <summary>
/// 登陆服务器
/// </summary>
/// <param name="userName">用户名</param>
private void LoginServer(string userName)
{
UserInfo userInfo = new UserInfo();
userInfo.Name = userName;
SuperSerializeHelper super = new SuperSerializeHelper();
byte[] data = super.Serialize(userInfo);//序列化对象
udpClient.Send(data, data.Length, serverIP);//发送
byte[] buff = udpClient.Receive(ref remotePoint);
object obj = super.Deserialize(buff);
if (obj != null)
{
if(obj.GetType() == typeof(UserInfo))
{
UserInfo u = (UserInfo)obj;
localUser = u;
}
}
}
private List<byte[]> listXm;
private void getXMessage(XMessage xm)
{
SuperSerializeHelper super = new SuperSerializeHelper();
if(xm.cmd == Cmd.Begin)
{
listXm = new List<byte[]>();
listXm.Add(xm.data);
XMessage x = (XMessage)super.Deserialize(udpClient.Receive(ref remotePoint));
getXMessage(x);
}
if (xm.cmd == Cmd.Sending)
{
listXm.Add(xm.data);
XMessage x = (XMessage)super.Deserialize(udpClient.Receive(ref remotePoint));
getXMessage(x);
}
if(xm.cmd == Cmd.End)
{
listXm.Add(xm.data);
}
}
private void btnLogin_Click(object sender, EventArgs e)
{
UserInfo user = new UserInfo();
user.Name = txtName.Text;
udpClient = new UdpClient();
remotePoint = new IPEndPoint(IPAddress.Any, 0);
serverIP = new IPEndPoint(IPAddress.Parse(txtIP.Text),50000);
LoginServer(user.Name);
bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = true;
bw.DoWork = new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerAsync();
}
private void label2_Click(object sender, EventArgs e)
{
txtIP.Text = SerializeHelper.GetIP();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(listUserInfo.Count.ToString());
}
private void button2_Click(object sender, EventArgs e)
{
if (txtFName.Text.Length != 0)
{
string strName = txtFName.Text;
UserInfo fUser = listUserInfo[strName];
remotePoint = fUser.Ip;
SendVideo();
}
}
private void button3_Click(object sender, EventArgs e)
{
try
{
MessageBox.Show(listUser.SelectedItem.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
private void listUser_MouseClick(object sender, MouseEventArgs e)
{
try
{
string fName = listUser.SelectedItem.ToString();
txtFName.Text = fName;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
private void ClientForm_Load(object sender, EventArgs e)
{
txtSendStr.Text = string.Empty;
_emotion = new EmotionDropdown();
_emotion.EmotionContainer.ItemClick = delegate(
object mySender, EmotionItemMouseClickEventArgs myE)
{
txtSendStr.InsertImageUseGifBox(myE.Item.Image);
emotionItem = myE.Item.Text;
emotionList.Add(emotionItem);
};
}
string tempStr = string.Empty;
public void showMessageStr(MyMessage mm)
{
txtRStr.AppendText("[" mm.User.Name "]" " " DateTime.Now.ToString() " " mm.User.Ip.ToString() "\r\n");
//txtRStr.AppendText("[" "admin" "]" " " DateTime.Now.ToString() " 192.168.1.151;10001 \r\n");
txtRStr.AppendText(" ");
foreach (string tempStr in mm.Face)
{
EmotionItem emo = getEmotionItem(tempStr);
if (emo != null)
{
txtRStr.InsertImageUseGifBox(emo.Image);
}
}
txtRStr.AppendText(mm.MessageStr "\r\n");
this.txtRStr.Select(this.txtRStr.TextLength, 0);//光标定位到文本最后
this.txtRStr.ScrollToCaret();//滚动到光标处
}
private void btnSendStr_Click(object sender, EventArgs e)
{
if (txtFName.Text.Equals(string.Empty))
{
MessageBox.Show("请选择好友");
return;
}
if (txtSendStr.Text.Equals(string.Empty) && this.emotionList.Count == 0)
{
MessageBox.Show("请输入聊天内容");
return;
}
string strName = txtFName.Text;
UserInfo fUser = listUserInfo[strName];
remotePoint = fUser.Ip;
MyMessage mm = new MyMessage();
mm.User = localUser;
List<string> tempList = new List<string>();
mm.MessageStr = txtSendStr.Text.Trim() ;
txtRStr.AppendText("[" mm.User.Name "]" " " DateTime.Now.ToString() " " mm.User.Ip.ToString() "\r\n");
//txtRStr.AppendText("[" "admin" "]" " " DateTime.Now.ToString() " 192.168.1.151;10001 \r\n");
txtRStr.AppendText(" ");
foreach (string tempStr in emotionList)
{
EmotionItem emo = getEmotionItem(tempStr);
if(emo!=null)
{
txtRStr.InsertImageUseGifBox(emo.Image);
mm.Face.Add(emo.Text);
}
}
txtRStr.AppendText(mm.MessageStr "\r\n");
txtSendStr.Text = string.Empty;
emotionList.Clear();
this.txtRStr.Select(this.txtRStr.TextLength, 0);//光标定位到文本最后
this.txtRStr.ScrollToCaret();//滚动到光标处
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
SuperSerializeHelper super = new SuperSerializeHelper();
byte[] data = super.Serialize(mm);
s.SendTo(data, remotePoint);
}
private void txtRStr_TextChanged(object sender, EventArgs e)
{
this.txtRStr.Select(this.txtRStr.TextLength, 0);//光标定位到文本最后
this.txtRStr.ScrollToCaret();//滚动到光标处
}
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
}
EmotionDropdown _emotion;
string emotionItem = null;
List<string> emotionList = new List<string>();
private EmotionItem getEmotionItem(string itemStr)
{
EmotionItem eitem = null;
foreach (EmotionItem item in _emotion.EmotionContainer.Items)
{
if (item.Text.Equals(itemStr))
{
eitem = item;
break;
}
}
return eitem;
}
private void labFase_MouseClick(object sender, MouseEventArgs e)
{
_emotion.Show(labFase);
}
private void txtRStr_TextChanged_1(object sender, EventArgs e)
{
}
private void timer1_Tick(object sender, EventArgs e)
{
StartSend();
}
}
}
相关软件
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)