UDP视频聊天室

一、简介

通过UDP传输实现文本聊天、视频通讯
实现这个功能需要三个类,一个负责绘制界面和图片、显示消息,一个负责将文本、图片转换为数据包并通过UDP发送,一个负责接收数据并还原成文本和图片

二、核心问题

1、利用Opencv打开摄像头获取图片
2、文本、图片转化为字节数组,利用字节数组的第一个位置进行图片和文本的标记
3、将字节数组打包成数据包,设置好目标IP及端口,并通过DatagramSocket发送
4、启用线程接收数据包,根据标志转换为文本或图片并显示

调用摄像头
导包:这是JavaCV 开发所有jar包
链接:https://pan.baidu.com/s/1JnusoGzZ-xcyN88-cHcZGQ
提取码:92xj

OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start();
Java2DFrameConverter converter = new Java2DFrameConverter();while (true) {BufferedImage self_image = converter.getBufferedImage(grabber.grabFrame());g.drawImage(self_image, 0, 0, 200, 200, null);//画笔g取自JPanel
}

UDP数据包及发送

public class Sender {public DatagramSocket dSender;public SocketAddress localAddr;public SocketAddress destAdd;private Sender() {try {// 1、创建本机地址端口对象(获取本机地址:InetAddress.getLocalHost().getHostAddress())localAddr = new InetSocketAddress(InetAddress.getLocalHost().getHostAddress(), 12000);// 2.创建发送的Socket对象dSender = new DatagramSocket(localAddr);// 3、创建对方地址端口对象( 测试暂用本机地址)destAdd = new InetSocketAddress(InetAddress.getLocalHost().getHostAddress(), 13000);} catch (Exception e) {}}private static Sender sender = new Sender();//此处纯粹练习一下单实例模型,主类中发送图片和发送文字是两个方法//但是在一个类中不会创建多个实例,所以没必要使用单实例public static Sender getInstance() {return sender;}public void sendPackage(byte[] buffer) { //转换好的需要传输的字节数组try {// 4.创建要发送的数据包,指定内容,指定目标地址DatagramPacket dp = new DatagramPacket(buffer, buffer.length,destAdd);// 5、发送数据包dSender.send(dp);} catch (Exception e) {}}
}

文本及图片转换为字节数组

public void send(String text) {byte[] temp = text.getBytes();byte[] buffer = new byte[temp.length+1];buffer[0] = 1;//作为文本消息的标记System.arraycopy(temp, 0, buffer, 1, temp.length); //将temp(偏移量为0)中内容复制到buffer(偏移量为1)中sendPackage(buffer);//调用方法发送数据包
}public void send(BufferedImage img) {try {//图片转为字节数组ByteArrayOutputStream bos = new ByteArrayOutputStream();ImageIO.write(img, "jpg", bos);byte[] temp = bos.toByteArray(); bos.close();byte[] buffer = new byte[temp.length+1];buffer[0] = 2;System.arraycopy(temp, 0, buffer, 1, temp.length);sendPackage(buffer);}catch (Exception e){}
}

通过线程接收数据包并处理

public class Receive extends Thread{static BufferedImage img;public void run() {DatagramSocket recvSocket = null;try {recvSocket = new DatagramSocket(13000); //跟发送方的目标端口要一致while (true) {// 2.指定接收缓冲区大小:每个包30000字节byte[] buffer = new byte[30000]; // 3.指定接收缓冲区大小:每个包20字节// 3.创建接收数据包对象DatagramPacket packet = new DatagramPacket(buffer,buffer.length);// 4.阻塞等待数据到来,如果收到数据,存入packet中的缓冲区中System.out.println("UDP服务器等待接收数据:");recvSocket.receive(packet);// 5、处理接收到的数据dataHanlder(buffer);}} catch (Exception e) {e.printStackTrace();}finally {recvSocket.close();}}private void dataHanlder(byte[] buffer) {if(buffer[0]==1) {int len = getValidLength(buffer); //获取有效长度byte[] data = new byte[len-1];System.arraycopy(buffer, 1, data, 0, data.length);String text = new String(data)+"\r\n";SendMain.setText("收到消息:"+text);}else if(buffer[0]==2) {byte[] data = new byte[buffer.length-1];System.arraycopy(buffer, 1, data, 0, data.length);ByteArrayInputStream bis = null;try {bis = new ByteArrayInputStream(data);img = ImageIO.read(bis);bis.close();} catch (Exception e) {e.printStackTrace();}}}private int getValidLength(byte[] buffer) {int i=0;while(buffer[i]!='\0') i++;return i;}
}

三、错误及解决

1、从接收的数据包中提取文本数据并转换为文本后显示在JTextArea中为空白,但是用Syso输出有 显示
原因是用于接收数据的字节数组定义的长度是30000,没有考虑数据包的有效长度,也没有对转换后的文本字符串进行去空白字符(用.trim()),所以显示为空白

2、线程接收的图片需要绘制在JPanel上,而摄像头图片的获取及绘制也是在while循环中,所以相当于两个线程需要使用同一个画笔,导致了线程安全问题,现象是小图片所在位置出现闪烁

处理方式:原本对于接收图片 绘制的方式是像文本信息的显示一样,调用窗体所在类中的绘制方法,把图片作为参数传递,窗体类中摄像头获取的图片绘制也通过这个方法,再对这个方法加一个synchronized,处理过后仍闪烁

解决:最后考虑问题可能不是线程问题,而是两个线程对重合部分的交替绘制不可避免地出现闪烁的情况,所以最终把接收的图片设置为静态变量,在窗体类中对两个图片一同绘制,从而解决闪烁的问题

四、扩展功能、及问题

实现超时重传(丢包重传)、接收数据包的大小定义问题、线程问题的处理

源码下载:https://github.com/Kevin1906721262/VideoChat

UDP视频聊天室(一)相关推荐

  1. 使用WebRTC搭建前端视频聊天室——数据通道篇

    转自 使用WebRTC搭建前端视频聊天室--数据通道篇 在两个浏览器中,为聊天.游戏.或是文件传输等需求发送信息是十分复杂的.通常情况下,我们需要建立一台服务器来转发数据,当然规模比较大的情况下,会扩 ...

  2. 视频聊天室软件的技术标准

    视频聊天室软件的技术标准 常规视频聊天软件的自定义功能及组别 可以根据自己运营的需要添加无限组别,并给不同的组别设定不同功能及图标: 自定义组别的权限,是否能踢人,是否能看密麦等: 视频聊天软件超低带 ...

  3. 使用WebRTC搭建前端视频聊天室-01——入门篇

    什么是WebRTC? 众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转.比如现在有两个客户端,甲和乙,他们俩想要通信,首先需要甲和服务器.乙和服务器之间建立信道.甲给乙发 ...

  4. 使用WebRTC搭建前端视频聊天室——入门篇

    转载自:使用WebRTC搭建前端视频聊天室--入门篇 什么是WebRTC? 众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转.比如现在有两个客户端,甲和乙,他们俩想要通信 ...

  5. FluorineFx + Flex视频聊天室案例开发----客户端

    上一篇<FluorineFx + Flex视频聊天室案例开发----服务器端>详细的介绍了如何利用FluorineFx开发一个及时通信的视频聊天室服务器处理程序,并通过Web网站来宿主这个 ...

  6. FMS案例开发--视频聊天室(三)

    本文要介绍的内容主要有利用SharedObject来实现聊天文字聊天和在线用户的列表,以及实现语音视频聊天等. 前一篇文章介绍了实现用户注册和登录的功能,本文接着介绍用户注册并成功登录后的相关功能开发 ...

  7. Flex与.NET互操作(十六):FluorineFx + Flex视频聊天室案例开发

    本文将使用FluorineFx和Flex结合介绍一个简单的视频聊天室案例开发,希望通过此篇和大家交流FluorineFx和Flex的相关技术,同时也希望本篇可以帮助到需要使用FluorineFx做及时 ...

  8. BAT蝙蝠视频聊天室(服务器+客户端+架设相关软件)免费提供

    BAT蝙蝠视频聊天室(服务器+客户端+架设相关软件) 网盘下载: http://adf.ly/5kgdg 介绍:

  9. 使用WebRTC搭建前端视频聊天室——点对点通信篇

    转载自:使用WebRTC搭建前端视频聊天室--点对点通信篇 WebRTC给我们带来了浏览器中的视频.音频聊天体验.但个人认为,它最实用的特性莫过于DataChannel--在浏览器之间建立一个点对点的 ...

  10. 网络视频聊天室的开发指南

    目前网上视频聊天室.视频会议软件.可视IP电话软件随处可见,你是否想自己做一个玩玩?其实这类软件无非是视频加上网络而建成的.如果熟悉视频捕 捉和网络传输技术,根本就难不倒你.本文详细介绍了如何利用别人 ...

最新文章

  1. Matlab与数据结构 -- 对向量的排序
  2. go如何使web工作
  3. java equal 不等于_java Integer判断相等只能使用equals(不能使用==)
  4. SQLSERVER2005的安装目录结构(下)
  5. VisualStudio2010 SP1 SP1 SDK SQLServer 2008 SP3 下载地址
  6. C#利用反射实现动态加载程序集简单案例
  7. 逼疯上海人的垃圾分类满月了:羊肉串变羊肉吕,奶茶里珍珠按颗算...
  8. java.lang.IllegalStateException: Failed to load ApplicationContext selenium 异常 解决
  9. netfilter和iptables的实现机制
  10. P2515 [HAOI2010]软件安装
  11. 【JavaWeb】医院药品入库管理系统
  12. CVE-2020-1938 /CNVD-2020-10487漏洞调试
  13. 转载关于后端开发需要学习的内容
  14. mysql 脏读 不可重复读 幻读_mysql事务隔离级别/脏读/不可重复读/幻读详解
  15. meld安装启动报错解决
  16. 青木的书籍,--股票
  17. Eclipse Debug: Drop to Frame
  18. decode()的用法
  19. 边边角 直角时 钝角时_几何中的角度名称:锐角,钝角,直角和直角,已定义...
  20. 轻松学习JavaScript十一:JavaScript基本类型(包含类型转换)和引用类型

热门文章

  1. 弹出启动windows安全中心服务器,Win10每次开机都弹出启用Windows安全中心服务怎么办?...
  2. ICP网站备案查询系统php版 v1.0+(源码)
  3. 《VERSE Versatile Graph Embeddings from Similarity Measures》阅读笔记
  4. 又一个程序员突然倒地,身体这件事一定要警钟长鸣!
  5. ​SIGIR 2022 | 港大、武大提出KGCL:基于知识图谱对比学习的推荐系统
  6. 什么是SSR(服务器渲染)
  7. 使用gsds绘制基因结构图_原来可以用R这么画基因结构图
  8. 淘宝店铺介绍范文如何写的技巧详细分析!
  9. 可以使用GPU暴力破解密码的软件
  10. 1.3.9 快速生成树配置