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

 

很簡陋對不對,因為篇幅有限,所以就先做到這里上面提供了優化的思路,看完代碼自己優化一下吧!!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM