import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import java.net.*; import java.io.*; public class Draw extends JFrame { public Draw(int myPort, String remHost, int remPort) { Paper p = new Paper(myPort, remHost, remPort); setDefaultCloseOperation(EXIT_ON_CLOSE); getContentPane().add(p, BorderLayout.CENTER); setSize(800, 600); show(); } public static void main(String[] args) { new Draw(Integer.parseInt(args[0]),args[1] ,Integer.parseInt(args[2])); } } class BoolPoint extends Point{ private boolean draw; public BoolPoint(int x, int y, boolean draw){ super(x, y); this.draw = draw; } boolean isTrue(){ return draw; } } class Paper extends JPanel implements Runnable{ public java.util.List hs = Collections.synchronizedList(new LinkedList()); public java.util.List rs = Collections.synchronizedList(new LinkedList()); public int myPort = 0; public String remHost = null; public int remPort = 0; public DatagramSocket socket = null; public Paper(int myPort, String remHost, int remPort) { setBackground(Color.pink); addMouseListener(new L1()); addMouseMotionListener(new L2()); this.myPort = myPort; this.remHost = remHost; this.remPort = remPort; try{ socket = new DatagramSocket(); }catch(SocketException se){ se.printStackTrace(); } Thread thread = new Thread(this); thread.start(); } public void paintComponent(Graphics g) { BoolPoint p = null; BoolPoint tmp = null; g.setColor(Color.blue); Iterator i = hs.iterator(); synchronized (hs){ if (i.hasNext()){ tmp = (BoolPoint)i.next(); if (!tmp.isTrue()) g.fillOval(tmp.x,tmp.y,1,1); while(i.hasNext()){ p = (BoolPoint)i.next(); if(p.isTrue()) g.drawLine(tmp.x, tmp.y, p.x, p.y); else g.fillOval(p.x,p.y,1,1); tmp = p; } } } synchronized (rs){ g.setColor(Color.red); i = rs.iterator(); if (i.hasNext()){ tmp = (BoolPoint)i.next(); if (!tmp.isTrue()) g.fillOval(tmp.x,tmp.y,1,1); while(i.hasNext()){ p = (BoolPoint)i.next(); if(p.isTrue()) g.drawLine(tmp.x, tmp.y, p.x, p.y); else g.fillOval(p.x,p.y,1,1); tmp = p; } } } } private void addPoint(Point p) { sendPoint(p); hs.add(p); repaint(); } private void sendPoint(Point p){ InetAddress address = null; try{ address = InetAddress.getByName(remHost); }catch(UnknownHostException uhe){ uhe.printStackTrace(); } String str = new String((int)p.getX()+" "+(int)p.getY()+" "+(((BoolPoint)p).isTrue()?'t':'f')); try{ socket.send(new DatagramPacket(str.getBytes(), 0, str.length(), address, remPort)); }catch(IOException ioe){ ioe.printStackTrace(); } } private void recivePoint(String data){ StringTokenizer str = new StringTokenizer(data, " "); rs.add(new BoolPoint(Integer.parseInt(str.nextToken()), Integer.parseInt(str.nextToken()), str.nextToken().equals("t")?true:false)); repaint(); } public void run(){ byte[] buffer = new byte[50]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); DatagramSocket socket = null; try{ socket = new DatagramSocket(myPort); }catch(SocketException se){ se.printStackTrace(); } while (true){ try{ socket.receive(packet); recivePoint(new String(packet.getData(), packet.getOffset(), packet.getLength())); }catch(Exception ioe){ ioe.printStackTrace(); } } } class L1 extends MouseAdapter { public void mousePressed(MouseEvent me) { addPoint(new BoolPoint(me.getX(), me.getY(), false)); } } class L2 extends MouseMotionAdapter { public void mouseDragged(MouseEvent me) { addPoint(new BoolPoint(me.getX(), me.getY(), true)); } } }