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,最后演示一下結果吧;
很簡陋對不對,因為篇幅有限,所以就先做到這里上面提供了優化的思路,看完代碼自己優化一下吧!!!!