zoukankan      html  css  js  c++  java
  • java 你画我猜 了解一下

    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,最后演示一下结果吧;

    很简陋对不对,因为篇幅有限,所以就先做到这里上面提供了优化的思路,看完代码自己优化一下吧!!!!

  • 相关阅读:
    lnmp环境搭建
    Git常用命令
    博客园写随笔环境搭建
    Win常用软件
    Docker环境搭建
    ESP-8266 RTOS 环境搭建
    查看Linux信息
    博客园markdown语法
    Java后台技术(TDDL)
    Java后台技术(Dubbo入门)
  • 原文地址:https://www.cnblogs.com/mayeye/p/9588591.html
Copyright © 2011-2022 走看看