基本信息
源码名称:C#实现UPD视频聊天 源码(亲测可用)
源码大小:3.99M
文件格式:.rar
开发语言:C#
更新时间:2018-04-20
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
通过UDP实现视频聊天,IP地址记得修改成自己服务器的ip, 服务端的端口开启的时候 参考下图即可
通过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(); } } }