Добавлен первый модуль второго семестра (второй вариант)

This commit is contained in:
Victor 2014-03-28 16:33:18 +02:00
parent a33683c490
commit f1224c7cca
6 changed files with 308 additions and 0 deletions

View File

@ -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;
}
}

View File

@ -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);
}
}
}
}
}
}

View File

@ -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;
}

View File

@ -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();
}
}
}
}

View File

@ -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) { }
}
}
}
}

View File

@ -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);
}
}