实例介绍
【实例简介】通过UDP实现视频聊天,IP地址记得修改成自己服务器的ip, 服务端的端口开启的时候 参考下图即可
【实例截图】
主要源码在上图红框的文件夹中
【核心代码】
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) 盖楼(回复)