我的世界java版怎么op
前几日写的一篇简陋之极的java聊天室被各位前辈说是,一塌糊涂,乌烟瘴气,只是简单的实现了需要的功能,并未做到人性化。在下痛定思痛,心想还是先学会显示功能再做美化界面,美化代码的打算!
在奋斗了一天之后终于完成了集图片,文字,直线等功能为一体的群聊天室。先分析代码如下:
关于界面什么的我就不说了,笔者在前面的博客中有提过!直接附上各种功能的实现方法。
首先我们要传送信息,必须要让被传送的对象知道我们传送的是什么东西,所以在传送信息之前,我们首先要确定一个协议,比如说当客户端接收到的第一个int 值为1的时候,它接下来就要再接收4个int值,据此来画一条直线,而我服务器画一条直线的时候可以获得该直线的四个int值,但是在利用IO流发送这四个int值的时候,我首先要先发送一个1,也就是说我每次在要发送一天直线之前就要先发送一个1,当然在客户端读取的时候,我们第一次读取到的是1,就接收四个int。当读完四个int之后并画完一条直线之后我们还要读取数据,如果还是1的话,我们继续上面的操作,如果读取的是2,按照规定的协议,我们就调用相应的方法即可!!!!
现附上服务器发送直线的代码如下,该代码是写在界面类里面的内部类:
1. //鼠标进入事件 2. MouseListener ms=(new 3. public void 4. 5. x1=e.getX(); 6. y1=e.getY(); 7. } 8. public void 9. int 10. int 11. g.drawLine(x1,y1,x2,y2); 12. 1); 13. ChatTools.castbyte(x1); 14. ChatTools.castbyte(y1); 15. ChatTools.castbyte(x2); 16. ChatTools.castbyte(y2); 17. } 18. public void 19. public void 20. public void 21. }); 22. jp.addMouseListener(ms);
当然相应的我们也要在客户端定义一个读取数据的方法,首先我们要判断发送过来的是什么东西,我设置的协议是,如果首先读到的是1,接下来就画直线,如果读到的是2,接下来就接收一张图片,如果读到的是4,接下来读到的就是一段文字。该方法是放在客户端的线程中的,并且在线程的Run方法中调用该方法。
并且在每执行完一次操作之后,便再次读取一个int值,再次判断该int值为多少,以便得到下一个执行的指令。
1. public void 2. try{ 3. ins=client.getInputStream(); 4. OutputStream out=client.getOutputStream(); 5. new 6. new 7. int 8. while(true){ 9. //如果读到的是1,调用读取线段的方法 10. if(t==1){ 11. readline(); 12. } 13. //读到的是2则调用接受画面的方法 14. if(t==2){ 15. readPic(); 16. } 17. //如果读到的是4,则调用接受文字的方法 18. if(t==4){ 19. readMsg(); 20. } 21. t=dis.readInt(); 22. } 23. catch(Exception ef){ 24. ef.printStackTrace(); 25. } 26. }
当判断int值为1的时候,我们就调用画直线的方法,该方法如下
1. //定义一个读取线段的方法 2. public void 3. try 4. int 5. int 6. int 7. int 8. g.drawLine(x1,y1,x2,y2); 9. catch 10. e.printStackTrace(); 11. } 12. }
当然,我们需要在客户端和服务器都要定义相同功能的传送和接收方法。
现在我们再写一个文字的接收方法,首先我们会在文本输入框中输入字符,并获得该文本内容,每当按下发送这个按钮时便调用消息的传送方法,将该消息发送出去!
1. ActionListener al=(new 2. public void 3. String s=e.getActionCommand(); 4. if(s.equals("创建")){ 5. 6. new Chatserver(9090,jta,dout,g); 7. cs.start(); 8. } 9. //将服务器消息发给每个人 10. if(s.equals("发送")){ 11. String msg=jte1.getText(); 12. ChatTools.castMsg(msg); 13. "服务器说:"+msg+"\r\n"); 14. ""); 15. }
其中ChatTools.castMsg();是一个消息群发的方法,该方法在队列类里面定义的,代码如下
1. //将一个消息发送给所有人 2. ublic static void 3. ChatTools.castbyte(4); 4. for(int i=0;i<list.size();i++){ 5. ServerThread st=list.get(i); 6. "说:"+str); 7. }
而sendMsg();则是一个消息的发送方法。该方法如下
1. //将发送消息的代码包装到一个方法中 2. public void 3. try{ 4. "\r\n"; 5. dout.write(msg.getBytes()); 6. //强制输出 7. dout.flush(); 8. catch(Exception ef){} 9. }
实现字符串传输的重中之重便是读取的方法,我们会首先获得一个为4的int值,然后我们就要调用字符串的读取方法
1. public void 2. try{ 3. new BufferedReader(new 4. String input=brd.readLine(); 5. "\r\n"); 6. catch(Exception ef){} 7. }
我使用的BufferedReader缓冲流,实现整行读取的方式,该方式不会产生乱码,所以还是不错的。
而我今天要重点讲的便是图片从文件中读取和传送的方法。
首先我们要获得图片,再者我们要获取图片的宽度和高度,在循环遍历每个像素点,获取该点的颜色值,接着我们便在画布中调用画线的方法,依次画出每个像素点,并相应的给每个点附上相应的颜色即可。这样一张图片就在自己的画布上显示出来了!代码如下
1. ActionListener al=(new 2. public void 3. String s=e.getActionCommand(); 4. if(s.equals("创建")){ 5. 6. new Chatserver(9090,jta,dout,g); 7. cs.start(); 8. } 9. //将服务器消息发给每个人 10. if(s.equals("发送")){ 11. String msg=jte1.getText(); 12. ChatTools.castMsg(msg); 13. "服务器说:"+msg+"\r\n"); 14. ""); 15. } 16. if(s.equals("图片")){ 17. 18. try 19. new File("2.jpg")); 20. int 21. int 22. 23. for(int i=0;i<n;i++){ 24. for(int j=0;j<m;j++){ 25. rgb=image.getRGB(i,j); 26. System.out.println(i); 27. System.out.println(j); 28. new 29. g.setColor(color); 30. g.drawLine(i,j,i,j); 31. 2); 32. ChatTools.castbyte(rgb); 33. ChatTools.castbyte(i); 34. ChatTools.castbyte(j); 35. } 36. 37. } 38. } catch 39. e1.printStackTrace(); 40. }
能画出图片,当然我们就能发送图片,我们就能相应的读取图片,在发送图片信息的时候,我们每取出一个点,就能获得该店的颜色,我们就把该点横坐标和纵坐标以及颜色值发送过去。在接收端,我们会首先读到一个为2的int值,然后程序会调用图片的读取方法。方法如下
1. //图片的读取方法 2. public void 3. int 4. try 5. rgb = dis.readInt(); 6. int 7. int 8. new 9. g.setColor(color); 10. g.drawLine(i,j,i,j); 11. 12. catch 13. 14. e.printStackTrace(); 15. } 16. }
值此,我们就实现了图片的发送功能了。我的代码也差不多了,至于如果有什么需要改进的地方请各位多多指教,本人是新手,迫切渴望成长,我也知道我的代码可定有很多漏洞,望不吝赐教!!!!!!!!!!!
现在附上具体的代码:服务器的四个类
界面类
1. import 2. import 3. import 4. import 5. import 6. import 7. import 8. import 9. import 10. import 11. 12. import 13. import 14. import 15. import 16. import 17. import 18. 19. public class 20. private int 21. private int 22. private 23. private 24. private int 25. 26. public void 27. new 28. " 服务器"); 29. 600,600); 30. null); 31. 3); 32. new JButton("创建"); 33. 0,0,60,30); 34. final JButton jm = new JButton("图片");// 实例化菜单栏的对象 35. &nb