JAVA从零实现简单的网络视频通信
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();
</