0-设计思路:
你画我猜顾名思义,有一个人画,一个人猜,两个思路:
1)一个中央服务器,中转数据,两个client端:,a画对应点的数据通过服务器发给客户端b,b通过这些数据进行绘画,换颜色人,等等,这种东西可以通过类似处理命令的方式用正则提取参数;
2)两个用户一个做服务端,一个做客户端,直接通信,a发送数据给b,然后b通过数据进行绘画;
1-技术准备:
1)用Java做绘图,详细方法请参见上一篇博客;
2)用java做socket字符窜传输;
3)正则表达式;自己了解一下
2-具体实现:
设计一个用于绘图的画板功能,1)可以控制画板是否可以编辑(只有画的一端可以编辑),2)可以实现绘图功能,3)内部实现socket的发送
代码如下:
package socket; import java.awt.Canvas; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.io.*; import java.net.Socket; import javax.swing.JFrame; public class DrawPanel extends Canvas{ Bean lastbean=null; boolean startdraw=false; Socket client=null; BufferedReader is =null;//input from client PrintWriter os=null; public void setClient(Socket s) { this.client=s; try { is = new BufferedReader(new InputStreamReader(client.getInputStream())); os=new PrintWriter(client.getOutputStream()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public DrawPanel(Boolean candraw) { DrawPanel that=this; MouseMotionListener mml=new MouseMotionListener() { @Override public void mouseDragged(MouseEvent e) { // TODO Auto-generated method stub int x=e.getX(); int y=e.getY(); if(that.client!=null) { os.println(""+x+","+y); os.flush(); } that.draw(x, y);; } @Override public void mouseMoved(MouseEvent e) { // TODO Auto-generated method stub } }; this.setPreferredSize(new Dimension(300,300)); if(candraw) { this.addMouseMotionListener(mml); } } public void draw(int x,int y) { this.lastbean=new Bean(x,y); this.repaint(); } public void paint(java.awt.Graphics g) { } public void update(java.awt.Graphics g) { //g.clearRect(0, 0, 300, 300); /*if(list.isEmpty()) { }else{*/ int x=this.lastbean.getX()-4; int y=this.lastbean.getY()-4; System.out.println("-----------------"); g.setColor(Color.black); g.fillOval(x, y, 8, 8); //} } public static void main(String[] args) { // TODO Auto-generated method stub JFrame j=new JFrame(); j.add(new DrawPanel(true)); j.pack(); j.setVisible(true); j.setResizable(false); } }
设计一个数据bean其实可有可无,起到一个封装数据的作用,编译传输;代码如下:
package socket; public class Bean { private int x; private int y; public Bean() { } public Bean(int x,int y) { this.x=x; this.y=y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } }
设计server端,在此我用的是画的人做server端)server端的画板是可编辑的:
代码如下:
package socket; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JFrame; public class Server{ DrawPanel dp=new DrawPanel(true); public Server() { boolean listenSuccess=false; int nowport=6000; ServerSocket server=null; Socket client=null; while(!listenSuccess) { try { System.out.println("listensing on port:"+nowport); server=new ServerSocket(nowport); System.out.println("I'm success listening on port ---->"+nowport); listenSuccess=true; } catch (IOException e) { System.out.println("filed listensing on port:"+nowport); nowport++; } } try { client=server.accept();//先实验一次坚挺 dp.setClient(client); JFrame j=new JFrame(); j.add(dp); j.pack(); j.setVisible(true); j.setResizable(false); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] a) { new Server(); } }
最后是clent端:
package socket; import java.io.IOException; import java.io.*; import java.net.Socket; import java.net.UnknownHostException; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JFrame; public class Client { DrawPanel dp=new DrawPanel(false); Socket client=null; public Client() { String pattern="([0-9]*),([0-9]*)";//[\\u4e00-\\u9fa5]* Pattern r = Pattern.compile(pattern); try { client=new Socket("127.0.0.1",6000); JFrame j=new JFrame(); j.add(dp); j.pack(); j.setVisible(true); j.setResizable(false); PrintWriter os=new PrintWriter(client.getOutputStream()); BufferedReader is=new BufferedReader(new InputStreamReader(client.getInputStream()));//由client对象构造一个输入流 while(true) { String s=is.readLine(); Matcher m = r.matcher(s); if(m.find()) { System.out.println("0"+m.group(0)); System.out.println("1"+m.group(1)); System.out.println("2"+m.group(2)); int x=Integer.parseInt(m.group(1)); int y=Integer.parseInt(m.group(2)); dp.draw(x, y); } } } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] a) { new Client(); } }
OK,最后演示一下结果吧;
很简陋对不对,因为篇幅有限,所以就先做到这里上面提供了优化的思路,看完代码自己优化一下吧!!!!