大概半个月,通过在网上找的资料,三个人摸索着用java写了个类似于网络教室的东东。实现了教学广播,屏幕监视,学生示例,文件传输,黑屏功能,并且今天终于能顺利的实现了退出,能够进行功能之间的切换。
其中最核心的功能是教学广播.它的原理是教师端不断的截全屏,并把全屏图片通过压缩,在用流通过线程传给学生机(用的是TCP/IP)。用到的知识点主要有:获取全屏大小(Toolkit.getDefaultToolkit().getScreenSize()),截全屏图像(robot.createScreenCapture(new Rectangle(....全屏大小))),用ZipOutputStream或buffereOutputStream流包装(socket.getOutputStream) ,用JPEGCodec.createJPEGEncoder(os).encode(p_w_picpath)(要加新的包);进行图片的编码压缩 。学生端就接受相应的流,将流生成BuffereImage 然后生成图片Image.。。。。屏幕监视是将教学广播反过来实现而已。。。。
这个项目做下来单个功能实现似乎还容易,毕竟网上资料找了些。整合的话就得自己弄了,对于菜鸟的我们就有困难了哈。因为这个东西用java做过的还是少的(真的的哪会用java),问同学,老师,没做过,一时半会而也搞不定。经过一番思考整体结构如下 :用List<Student>来存放连接上来了的学生机,Student类用来存放连接上来的一些信息如Socket.一个端口用来传输命令到学生机,学生机接受到命令执行相应的操作。因为知道了学生机的Socket就可以获取学生机的IP。通过这个Ip再用一个端口建立一个套接字用来不断向学生机发送截屏图片(有几个学生机连上,就要新建几个线程,这个循环LIST就行)。。。好吧终于实现了可以对多台学生机传输的时候,退出的问题就出来了。拿比较复杂的学生示例来说:学生示例这个功能我是通过教师端收到指定学生端的截屏图片然后全屏显示,再将全屏截给其他普通学生机。我要退出,就要首先传命令给指定学生机让它结束循环发送截图的线程。教师端要结束接受截图线程并关闭显示图片用的窗口。接下来教师端要结束发送截图给普通学生机的线程,再传送命令给其他普通学生机让他们关闭接受教师端截图的线程和窗口。整个过程就是这样,但结束线程又有问题了,stop()说是不安全的,基本已不用了。还有就是设置标识位,当想要结束一个线程时(因为线程一直在执行while(flag)循环),设置flag为false,让其执行完后结束。还有一种是关闭ServerSocket。。。。每一种单独试过,都报异常。。最后用的是双保险,,,,,。。。