JAVA从零实现简单的网络视频通信

JAVA从零实现简单的网络视频通信1、服务器和客户端的创建服务器的创建客户端的创建2、服务器和客户端间的信息传输服务器向客户端传输视频的获取视频的处理传输的协议服务器的接收1、服务器和客户端的创建服务器的创建创建服务器通过实现服务器套接字,java.net包下的ServerSocket,并指定服务器对象绑定的端口port,java.net.ServerSocket s = new java.net.ServerSocket(int port)然后等待客户机进入,若无客户机连接,则阻塞在这一步j
摘要由CSDN通过智能技术生成

1、服务器和客户端的创建

服务器的创建

创建服务器通过实现服务器套接字,java.net包下的ServerSocket,并指定服务器对象绑定的端口port,

java.net.ServerSocket s = new java.net.ServerSocket(int port)

然后等待客户机进入,若无客户机连接,则阻塞在这一步

java.net.Socket c = s.accept();

客户机进去后初始化输入输出流

java.io.InputStream in = c.getInputStream();
java.io.OutputStream out = c.getOutputStream();

基本的服务器就创建成功,接下来就是用io和客户端进行通信

客户端的创建

创建客户端通过实现套接字,java.net包下的Socket,并指定客户端对象连接的目标服务器的ip地址和端口port

java.net.Socket client = new java.net.Socket(String ip,int port);

同样然后我们获取客户端的输入输出流

java.io.InputStream in = client.getInputStream();
java.io.OutputStream out = client.getOutputStream();

基本服务器创建成功

2、服务器和客户端间的信息传输

服务器的客户端对象的I/O对接用户客户端对象的O/I

服务器向客户端传输

在服务器上
我们调用服务器上与相应的客户端对象获取的Socket对象c的输出流来发送。

c.write();

OutputSream只给我们了输出字节的方法,同样InputStream也只能接受字节类型,所以我们这里可以使用数据流来传输数据,这样就可以传int等类型

DataOutputStream dout = new DataOutputStream(out);
dout.writeInt();

在客户端上

client.read();
//对应于数据流
DataInputStream din = new DataInputStream(int)
din.readInt();

视频的获取

我们知道视频即是一张张快速切换的图片,因此我们只需要调用摄像头将每个时刻拍摄的图片通过io流从客户端发到服务器端即可完成
这里我们引入外部开源库获取摄像头权限并获得图片image
库网址http://webcam-capture.sarxos.pl/

// get default webcam and open it获取网络摄像头设置并打开
		Webcam webcam = Webcam.getDefault();
		webcam.open();
       
		while(true) {
   
		// get image获取图片
		BufferedImage image = webcam.getImage();

视频的处理

我们拿到一张张图片后,将每一张图片转成一个二维数组,这样我们就可以将二维数组发送给服务器端。
将图片转成二维数组只需要遍历图片的每个像素点并且获取他们的RGB值即可

//我们创建一个二维数组来保存这张图片的信息
int[][] video = new int[image.getWidth()][image.getHeight()];
//然后遍历这个图片所有的像素点,并将对应点的RGB值保存在video数组中
for (int i=0; i<image.getWidth(); i++){
   
    for (int j=0; ;<image.getHeight();j++){
   
         video[i][j] = image.getRGB(i,j);
    }
}

这样我们就获取了视频的全部数据,接下来只要将这些数据用DataOutputStream的writeInt()传给服务器端

传输的协议

协议即是双方做的一个约定,在传输的一个个字节中,我们要按什么方式将这些字节读取。如果视频加入别的功能,那传输数据时如何知道是传输的视频数据还是别的功能的数据。
因此我们在传输数据时先要约定一个报文头,服务器端收到报文头了才知道接下来接受的是用作什么的数据。

这里因为只实现视频故我们不传表示类型的报文头,我们先将图片的尺寸在每次传输图片数据前发给服务器端,这样服务器就知道接下来要读取的视频数据大小有多少个字节,有多长

//在这里我们先把图片尺寸传给服务器
dout.writeInt(image.getWidth());
dout.writeInt(image.getHeight();
</
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值