您的位置:首页 > 其它

HuaXinIM聊项目阶段总结二(从别人身上总结经验吸取教训)

2016-05-13 00:10 246 查看
今天在华信继续完成HuaXinIM聊项目,有一个人没来,有一个只来了一会儿,其中一人项目完成得差不多了,另一个人忙完了他的事,也开始项目的编程了,但是因为他们今晚不在华信上课,所以我们没有太多的交流,对于他们的项目也不太了解,其中一个组员对框架提出了意见,经过思索,发现还是可取的。

今晚的课程时间是小组各完成各自项目,其中一个组员的对于他所负责的项目内容不太了解,思路也不太清晰,所以我今晚几乎都在他的身边帮助他理清思路。

平时他要忙的事似乎比较多,所以有可能课程不太跟得上,一些Java的基础知识也不太牢固,对于Java的基本思想封装性也了解得不够深入,这是我在帮助他,让他理清思路编写远程控制模块的时候发现的问题。

在跟他讲解的时候,我也发现了团队项目的完成不能够有太多的限定,我本以为在那个类里面只要两个方法就可以了,但是这也是我的想法。

但是我在帮助他理清思路的时候,发现他老是问我:“是不是这样”、“这样可不可以”、“这样对不对”。

刚开始我一直回答他的问题,到了后来我发现了不太对劲,似乎心里有一个疑问:怎么好像是他遇到问题,然后抛给了我,我得出了答案,然后告诉他一样?事实上也确实如此,我代替了他的思考,剥夺了他的主动性,这样确实可以让项目更快的完成,但是他从中学习到的知识与积累下的经验也就聊聊无几了。

后来我就改变了帮助的方法,我不回答他的问题,反而问他问题,然后让他自己解答;他遇到了不确定的地方,怕犯错误,然后问我正确与否,我也不回答,让他自己去尝试,这也是我亲身的经验:犯过错误才能够印象深刻。

这样之后,虽然后来时间长了很多,但是我确实帮助了他,让他从中学习到了很多知识经验,最后终于把远程控制的代码编写完成。

在代码的封装性与整洁度上看,他的代码确实惨不忍睹...下面发上来,让诸君看一看:

// 控制方法Control() 被控制方法byControled()
// 获取io流
public ObjectInputStream ois;
public ObjectOutputStream oos;

public DistanceControl(ObjectInputStream ois, ObjectOutputStream oos) {
this.ois = ois;
this.oos = oos;
}

// 定义一个机器人类对象,用于操控
private Robot robot;

{
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
}

public JLabel imageLabel;

/**
* 初始化窗体
*/
public void Control() {
imageLabel = new JLabel();
this.add(imageLabel);
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(dim);
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
new Thread() {
public void run() {
while (true) {
// 显示屏幕
receivePicture();
}
}
}.start();
this.setVisible(true);
this.addMouseListener(ma);
this.addMouseMotionListener(ma);
this.addMouseWheelListener(ma);
this.addKeyListener(ka);

}

/**
* 鼠标监听
*/
MouseAdapter ma = new MouseAdapter() {
public void mousePressed(MouseEvent e) {
sendEvent(e);
}

public void mouseReleased(MouseEvent e) {
sendEvent(e);
}

public void mouseClicked(MouseEvent e) {
sendEvent(e);
}

public void mouseMoved(MouseEvent e) {
sendEvent(e);
}

public void mouseDragged(MouseEvent e) {
sendEvent(e);
}
};
/**
* 键盘监听
*/
KeyAdapter ka = new KeyAdapter() {
public void keyPressed(KeyEvent e) {
sendEvent(e);
}

public void keyReleased(KeyEvent e) {
sendEvent(e);
}
};

/**
* 发送事件
*/
private void sendEvent(InputEvent e) {
try {
oos.writeObject(e);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}

/**
* 接收截图
*/
public void receivePicture() {
try {
// 获取长度
int imageLength = ois.readInt();
// 创建图片字节数组
byte[] data = new byte[imageLength];
// 读取一张图片的字节数组
ois.readFully(data);
// 将读入字节转化为一个BufferedImage对象
ByteArrayInputStream bais = new ByteArrayInputStream(data);
BufferedImage image = ImageIO.read(bais);
ImageIcon icon = new ImageIcon(image);
imageLabel.setIcon(icon);
imageLabel.repaint();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 被控制方法
*/
public void byControled() {
try {
// 发送图片
new Thread() {
public void run() {
while (true) {
try {
createImage();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}.start();
new Thread() {
public void run() {
while (true) {
// 读取操作
readOperate();
}
}
}.start();
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 读操作对象
*/
public void readOperate() {
try {
// 读对象
Object ie = ois.readObject();
// 判断转换前的类型
if (ie instanceof MouseEvent) {
// 转换为鼠标事件
MouseEvent me = (MouseEvent) ie;
// 判断当前鼠标事件是由什么触发的
int id = me.getID();
if (id == MouseEvent.MOUSE_PRESSED) {// 按下
int number = me.getButton();
if (number == MouseEvent.BUTTON1) {
robot.mousePress(InputEvent.BUTTON1_MASK);
} else if (number == MouseEvent.BUTTON2) {
robot.mousePress(InputEvent.BUTTON2_MASK);
} else if (number == MouseEvent.BUTTON3) {
robot.mousePress(InputEvent.BUTTON3_MASK);
}
} else if (id == MouseEvent.MOUSE_CLICKED || id == MouseEvent.MOUSE_RELEASED) {// 移动
int number = me.getButton();
if (number == MouseEvent.BUTTON1) {
robot.mousePress(InputEvent.BUTTON1_MASK);
} else if (number == MouseEvent.BUTTON2) {
robot.mousePress(InputEvent.BUTTON2_MASK);
} else if (number == MouseEvent.BUTTON3) {
robot.mousePress(InputEvent.BUTTON3_MASK);
}
} else if (id == MouseEvent.MOUSE_DRAGGED || id == MouseEvent.MOUSE_MOVED) {// 点击
robot.mouseMove(me.getX(), me.getY());
}
} else if (ie instanceof KeyEvent) {
// 转换为键盘事件
KeyEvent me = (KeyEvent) ie;
int id = me.getID();
System.out.println(id);
if (id == KeyEvent.KEY_PRESSED) {
robot.keyPress(me.getKeyCode());
} else if (id == KeyEvent.KEY_RELEASED) {
robot.keyRelease(me.getKeyCode());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 获取屏幕截图并发送
*
* @throws IOException
*/
public void createImage() throws Exception {
Toolkit tk = Toolkit.getDefaultToolkit();
// 获取屏幕大小
Dimension dm = tk.getScreenSize();
// 设定区域的大小
Rectangle rt = new Rectangle(0, 0, dm.width, dm.height);
// 取得指定大小的一张图片
BufferedImage image = robot.createScreenCapture(rt);
// 创建一段内存流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 将图片数据写入内存流
ImageIO.write(image, "jpeg", baos);
// 创建字节数组
byte[] data = baos.toByteArray();
// 发送图片数据长度
oos.writeInt(data.length);
// 写入图片字节数据
oos.write(data);
oos.flush();
Thread.sleep(20);
}


在编写代码的时候,发现他一个不太可取的地方就是:他是在测试项目中写实现的代码,然后直接复制粘贴到了项目框架上去了,而不想想每一行代码的逻辑结构与模块的组成,代码之间的耦合度与如何解耦。

要是我写的话,我会在框架上重新创建一个方法:里面先写上

//TODO 创建窗体,添加监听器

//TODO 实时接收截图

//TODO 发送鼠标事件

然后就是代码的一个个填充,而不会省事的把测试项目中的代码直接照搬到框架上,再慢慢修改,说实话:看到他复制粘贴那一幕我真是惊呆了...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: