From f1224c7ccaa48e8efac9bd563c2bc15a0f076812 Mon Sep 17 00:00:00 2001 From: Victor Date: Fri, 28 Mar 2014 16:33:18 +0200 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BF=D0=B5=D1=80=D0=B2=D1=8B=D0=B9=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B4=D1=83=D0=BB=D1=8C=20=D0=B2=D1=82=D0=BE=D1=80=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=81=D0=B5=D0=BC=D0=B5=D1=81=D1=82=D1=80=D0=B0=20(?= =?UTF-8?q?=D0=B2=D1=82=D0=BE=D1=80=D0=BE=D0=B9=20=D0=B2=D0=B0=D1=80=D0=B8?= =?UTF-8?q?=D0=B0=D0=BD=D1=82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/module2/variant2/Circle.java | 51 +++++++++++++++ src/module2/variant2/ClientForm.java | 68 +++++++++++++++++++ src/module2/variant2/Constants.java | 12 ++++ src/module2/variant2/SocketClient.java | 40 +++++++++++ src/module2/variant2/SocketServer.java | 91 ++++++++++++++++++++++++++ src/module2/variant2/Util.java | 46 +++++++++++++ 6 files changed, 308 insertions(+) create mode 100644 src/module2/variant2/Circle.java create mode 100644 src/module2/variant2/ClientForm.java create mode 100644 src/module2/variant2/Constants.java create mode 100644 src/module2/variant2/SocketClient.java create mode 100644 src/module2/variant2/SocketServer.java create mode 100644 src/module2/variant2/Util.java diff --git a/src/module2/variant2/Circle.java b/src/module2/variant2/Circle.java new file mode 100644 index 0000000..ec6876b --- /dev/null +++ b/src/module2/variant2/Circle.java @@ -0,0 +1,51 @@ +package module2.variant2; + +import java.awt.Color; +import java.awt.Graphics2D; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import static module2.variant2.Constants.HEIGHT; +import static module2.variant2.Constants.WIDTH; + +/** + * + * @author aNNiMON + */ +public final class Circle { + + private int x, y; + private int radius; + private int color; + + public void draw(Graphics2D g) { + g.setColor(new Color(color)); + g.fillOval(x, y, radius, radius); + } + + public void writeData(DataOutputStream dos) throws IOException { + dos.writeInt(x); + dos.writeInt(y); + dos.writeInt(radius); + dos.writeInt(color); + } + + public void readData(DataInputStream dis) throws IOException { + x = dis.readInt(); + y = dis.readInt(); + radius = dis.readInt(); + color = dis.readInt(); + } + + public void generate() { + radius = Util.rand(20, 100); + x = Util.rand(WIDTH - radius); + y = Util.rand(HEIGHT - radius); + color = Util.randomColor(0, 255); + } + + @Override + public String toString() { + return x + ":" + y + " " + radius; + } +} diff --git a/src/module2/variant2/ClientForm.java b/src/module2/variant2/ClientForm.java new file mode 100644 index 0000000..647a5b4 --- /dev/null +++ b/src/module2/variant2/ClientForm.java @@ -0,0 +1,68 @@ +package module2.variant2; + +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.io.IOException; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import static module2.variant2.Constants.CIRCLES_COUNT; + +/** + * + * @author aNNiMON + */ +public final class ClientForm extends JFrame { + + public static void main(String[] args) throws IOException { + final String ip = JOptionPane.showInputDialog(null, "Введите IP", "127.0.0.1"); + ClientForm form = new ClientForm(ip); + form.setVisible(true); + form.setClient(); + } + + private final String ip; + private SocketClient client; + private final Circle[] circles; + + public ClientForm(String ip) { + super(); + this.ip = ip; + setDefaultCloseOperation(EXIT_ON_CLOSE); + Panel panel = new Panel(); + panel.setPreferredSize(new Dimension(Constants.WIDTH, Constants.HEIGHT)); + add(panel); + pack(); + circles = new Circle[CIRCLES_COUNT]; + for (int i = 0; i < CIRCLES_COUNT; i++) { + circles[i] = new Circle(); + } + } + + public void setClient() throws IOException { + client = new SocketClient(ip, this); + client.start(); + } + + public synchronized Circle getCircle(int index) { + return circles[index]; + } + + private class Panel extends JPanel { + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + final Graphics2D g2d = (Graphics2D) g.create(); + synchronized (circles) { + if (circles == null) return; + for (Circle circle : circles) { + if (circle != null) { + circle.draw(g2d); + } + } + } + } + } +} diff --git a/src/module2/variant2/Constants.java b/src/module2/variant2/Constants.java new file mode 100644 index 0000000..e0add54 --- /dev/null +++ b/src/module2/variant2/Constants.java @@ -0,0 +1,12 @@ +package module2.variant2; + +/** + * + * @author aNNiMON + */ +public final class Constants { + + public static final int WIDTH = 640, HEIGHT = 480; + public static final int PORT = 7281; + public static final int CIRCLES_COUNT = 10; +} diff --git a/src/module2/variant2/SocketClient.java b/src/module2/variant2/SocketClient.java new file mode 100644 index 0000000..55ae172 --- /dev/null +++ b/src/module2/variant2/SocketClient.java @@ -0,0 +1,40 @@ +package module2.variant2; + +import java.io.DataInputStream; +import java.io.IOException; +import java.net.Socket; +import static module2.variant2.Constants.PORT; + +/** + * + * @author aNNiMON + */ +public final class SocketClient extends Thread { + + private final Socket socket; + private final DataInputStream dis; + private final ClientForm form; + + public SocketClient(String host, ClientForm form) throws IOException { + this.form = form; + socket = new Socket(host, PORT); + dis = new DataInputStream(socket.getInputStream()); + } + + @Override + public void run() { + while (true) { + try { + final int size = dis.readInt(); + for (int i = 0; i < size; i++) { + Circle circle = form.getCircle(i); + circle.readData(dis); + } + form.repaint(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + +} diff --git a/src/module2/variant2/SocketServer.java b/src/module2/variant2/SocketServer.java new file mode 100644 index 0000000..15b6b56 --- /dev/null +++ b/src/module2/variant2/SocketServer.java @@ -0,0 +1,91 @@ +package module2.variant2; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.UnknownHostException; +import java.util.Timer; +import java.util.TimerTask; +import static module2.variant2.Constants.CIRCLES_COUNT; +import static module2.variant2.Constants.PORT; + +/** + * + * @author aNNiMON + */ +public final class SocketServer extends Thread { + + private static final int GENERATE_DELAY = 2000; + + public static void main(String[] args) throws IOException { + new SocketServer().start(); + } + + private final Circle[] circles; + private final ServerSocket serverSocket; + private final Timer timer; + + public SocketServer() throws IOException { + serverSocket = new ServerSocket(PORT); + circles = new Circle[CIRCLES_COUNT]; + for (int i = 0; i < CIRCLES_COUNT; i++) { + circles[i] = new Circle(); + circles[i].generate(); + } + System.out.println(getInetAddress()); + timer = new Timer(); + timer.scheduleAtFixedRate(new TimerTask() { + + @Override + public void run() { + synchronized (circles) { + for (Circle circle : circles) { + circle.generate(); + } + } + } + }, GENERATE_DELAY, 1000); + } + + public static String getInetAddress() throws UnknownHostException { + return InetAddress.getLocalHost().getHostAddress(); + } + + @Override + public void run() { + while (true) { + try { + final Socket socket = serverSocket.accept(); + new WorkingThread(socket).start(); + } catch (IOException ex) { + ex.printStackTrace();// break; + } + } + } + + private class WorkingThread extends Thread { + + private final DataOutputStream dos; + + public WorkingThread(Socket socket) throws IOException { + this.dos = new DataOutputStream(socket.getOutputStream()); + } + + @Override + public void run() { + while (true) { + try { + dos.writeInt(circles.length); + for (Circle circle : circles) { + circle.writeData(dos); + } +// try { +// Thread.sleep(GENERATE_DELAY); +// } catch (InterruptedException ex) { } + } catch (IOException ex) { } + } + } + } +} diff --git a/src/module2/variant2/Util.java b/src/module2/variant2/Util.java new file mode 100644 index 0000000..9546494 --- /dev/null +++ b/src/module2/variant2/Util.java @@ -0,0 +1,46 @@ +package module2.variant2; + +import java.util.Random; + +/** + * + * @author aNNiMON + */ +public final class Util { + + private static final Random random = new Random(); + + public static int rand(int to) { + return random.nextInt(to); + } + + public static int rand(int from, int to) { + return random.nextInt(to - from + 1) + from; + } + + public static int randomColor(int from, int to) { + if (from < 0) { + from = 0; + } else if (from > 255) { + from = 255; + } + if (to < 0) { + to = 0; + } else if (to > 255) { + to = 255; + } + if (from == to) { + return (0xFF000000 | (from << 16) | (from << 8) | from); + } else if (from > to) { + final int temp = to; + to = from; + from = temp; + } + + final int red = rand(from, to); + final int green = rand(from, to); + final int blue = rand(from, to); + + return (0xFF000000 | (red << 16) | (green << 8) | blue); + } +}