Системы программирования Internet-приложений
Лабораторная работа #3
Вариант 137
Протокол - TCP
Работы выполнили
Голубцов Евгений
Пермяков Валерий
Группа 3100
2010
Лабораторная работа #3
По заданному номеру варианта и протоколу создать клиент-серверное приложение. Сервер Принимает запросы по заданному транспортному протоколу на выбранный порт. В запросе передаются параметры X,Y,R. Ответом сервера является признак попадания точки в область. Сервер должен использовать многопоточность - каждый запрос обрабатывается в отдельном потоке команд (Thread). Клиент Клиент должен представлять собой апплет, реализованный на основе приложения из л.р. №2. Ввод координат X,Y,R осуществляется при помощи клика мышки и текстовых полей. Апплет должен рисовать точку определенным цветом на основе ответа сервера. Если сервер недоступен - точка должна рисоваться третьим цветом. Вопросы к защите лабораторной работы:
|
Код программы:
DrawFrame.java
package mainframe;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.swing.*;
import java.net.*;
enum States { InArea, NotInArea, NoResponse };
// Фрейм для рисования области
public class DrawFrame extends JApplet {
static final int DEFAULT_WIDTH = getMonWidth();
static final int DEFAULT_HEIGHT = getMonHeight();
static int iterator;
NPanel panel = new NPanel();
DrawComponent component = new DrawComponent();
Socket socket;
private double x;
private double y;
private double R;
private States state;
public void init() {
component.addMouseListener(new MouseHandler()); // Создание обработчика
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); // Размер фрейма
add(component, BorderLayout.CENTER); // Добавление компонента к фрейму
add(panel, BorderLayout.WEST); // Добавление панели к фрейму
panel.jButton1.addActionListener(new ButtonAction()); // Связывание обработчика с кнопкой
R = 3;
setVisible(true);
}
// Определение ширины экрана
protected static int getMonWidth() {
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize(); // Возращает размер экрана в виде объекта Dimension
int screenWidth = screenSize.width;
return screenWidth;
}
// Определение высоты экрана
protected static int getMonHeight() {
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int screenHeight = screenSize.height - screenSize.height / 20;
return screenHeight;
}
private void isInAreaRequest() {
DataInputStream dis;
DataOutputStream dos;
try {
socket = new Socket(InetAddress.getLocalHost(), 7070);
socket.setSoTimeout(50);
dis = new DataInputStream(socket.getInputStream());
dos = new DataOutputStream(socket.getOutputStream());
dos.writeDouble(x);
dos.writeDouble(y);
dos.writeDouble(R);
if (dis.readBoolean()) {
state = States.InArea;
} else {
state = States.NotInArea;
}
dos.close();
dis.close();
socket.close();
} catch (UnknownHostException e) {
state = States.NoResponse;
} catch (IOException e) {
state = States.NoResponse;
}
switch (state) {
case InArea:
panel.jLabel8.setText("Point is in area");
break;
case NotInArea:
panel.jLabel8.setText("Point is not in area");
break;
case NoResponse:
panel.jLabel8.setText("Server does not response");
break;
}
}
private class MouseHandler extends MouseAdapter {
public void mousePressed(MouseEvent event) // Реакция на нажатие левой кнопки на мыши
{
panel.drawKoord(event.getPoint(), component);
x = panel.setDecX(event.getPoint().getX(), component);
y = panel.setDecY(event.getPoint().getY(), component);
Point2D p = new Point2D.Double(event.getPoint().getX(), event.getPoint().getY());
isInAreaRequest();
component.add(p, state);
}
}
// Когда кнопка нажата, устанавливаем точку
private class ButtonAction implements ActionListener {
public void actionPerformed(ActionEvent event) {
String jTextX = panel.jTextField4.getText();
String jTextY = panel.jTextField5.getText();
String jTextR = panel.jTextField3.getText();
try {
x = Double.parseDouble(jTextX);
y = Double.parseDouble(jTextY);
R = Double.parseDouble(jTextR);
if (R <= 0) {
panel.jLabel8.setText("R must be positive!");
return;
}
} catch (NumberFormatException e) {
panel.jLabel8.setText("It's not a real number!");
return;
}
panel.jTextField1.setText(jTextX);
panel.jTextField2.setText(jTextY);
panel.setOldLogicRad(panel.getLogicRad());
panel.setLogicRad(R);
component.repaintPoints(panel);
Point2D p =
new Point2D.Double(panel.setPixelX(Double.parseDouble(jTextX), component),
panel.setPixelY(Double.parseDouble(jTextY), component));
isInAreaRequest();
component.add(p, state); // Добавляем компонент р в контейнер
}
}
}
DrawComponent.java
package mainframe;
import java.awt.*;
import java.util.*;
import java.awt.geom.*;
import javax.swing.*;
class DrawComponent extends JComponent {
public final int G_WIDTH = DrawFrame.getMonWidth() / 16 * 13;
public final int G_HEIGHT = DrawFrame.getMonHeight() / 16 * 15;
public final int X_BOUND = G_WIDTH / 10;
public final int Y_BOUND = G_HEIGHT / 12;
public final double rad = G_HEIGHT * 3 / 8;
private ArrayList<Rectangle2D> squares;
private ArrayList<States> states;
private Rectangle2D current;
private Shape[] area;
public DrawComponent() {
squares = new ArrayList<Rectangle2D>();
states = new ArrayList<States>();
current = null;
}
// Ось ОХ
private Line2D buildOsX() {
double x0 = X_BOUND;
double y0 = G_HEIGHT / 2;
double xk = G_WIDTH - X_BOUND;
double yk = G_HEIGHT / 2;
Line2D osx = new Line2D.Double(x0, y0, xk, yk);
return osx;
}
// Ось ОУ
private Line2D buildOsY() {
double x0 = G_WIDTH / 2;
double y0 = Y_BOUND;
double xk = G_WIDTH / 2;
double yk = G_HEIGHT - Y_BOUND;
Line2D osy = new Line2D.Double(x0, y0, xk, yk);
return osy;
}
// Деления на оси ОХ
private Line2D buildRiskaX(double x0) {
Line2D risx = new Line2D.Double(x0,
(double) (G_HEIGHT / 2 - G_HEIGHT / 100),
x0,
(double) (G_HEIGHT / 2 + G_HEIGHT / 100));
return risx;
}
// Деления на оси ОУ
private Line2D buildRiskaY(double y0) {
Line2D risy = new Line2D.Double(G_WIDTH / 2 - G_HEIGHT / 100,
y0,
G_WIDTH / 2 + G_HEIGHT / 100,
y0);
return risy;
}
// Прямоугольник
private Rectangle2D buildRec() {
double leftX = G_WIDTH / 2;
double topY = G_HEIGHT / 2 - rad / 2;
double width = rad + 1;
double height = rad / 2 + 1;
Rectangle2D rect = new Rectangle2D.Double(leftX, topY, width, height);
return rect;
}
// Треугольник
private GeneralPath buildTr() {
GeneralPath tr = new GeneralPath();
tr.moveTo(G_WIDTH / 2 + 1, G_HEIGHT / 2 + 1);
tr.lineTo(G_WIDTH / 2, G_HEIGHT / 2 + rad);
tr.lineTo(G_WIDTH / 2 - rad - 1, G_HEIGHT / 2);
tr.closePath();
return tr;
}
// Сектор
private Arc2D buildSector() {
Arc2D sector = new Arc2D.Double(G_WIDTH / 2 - rad / 2,
G_HEIGHT / 2 - rad / 2, rad + 1, rad + 1, 90, 90, Arc2D.PIE);
return sector;
}
// Панель, на которой отображаются наша область
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(Color.green);
// Рисуем прямоугольник
Rectangle2D rect = this.buildRec();
g2.fill(rect);
// Рисуем треугольник
GeneralPath tr = this.buildTr();
g2.fill(tr);
// Рисуем сектор
Arc2D sector = this.buildSector();
g2.fill(sector);
g2.setPaint(Color.BLACK); // Заполнение черным
g2.setStroke(new BasicStroke(2)); // Изменение ширины линии
// Рисуем ось ОХ
Line2D linex = this.buildOsX();
g2.draw(linex);
area = new Shape[]{sector, tr, rect};
// Рисуем ось ОУ
Line2D liney = this.buildOsY();
g2.draw(liney);
// Рисуем деления и R
Line2D[] riska = new Line2D[5];
for (int i = 0; i < 5; i++) {
riska[i] = this.buildRiskaX(G_WIDTH / 2 - rad + i * (rad / 2));
g2.draw(riska[i]);
riska[i] = this.buildRiskaY(G_HEIGHT / 2 - rad + i * (rad / 2));
g2.draw(riska[i]);
}
g2.drawString("R", G_WIDTH / 2 + G_WIDTH / 160, (int) (G_HEIGHT / 2 - rad - G_HEIGHT / 80));
g2.drawString("R", (int) (G_WIDTH / 2 + G_WIDTH / 160 + rad), (int) (G_HEIGHT / 2 - G_HEIGHT / 80));
g2.drawString("R/2", G_WIDTH / 2 + G_WIDTH / 160, (int) (G_HEIGHT / 2 - rad / 2 - G_HEIGHT / 80));
g2.drawString("R/2", (int) (G_WIDTH / 2 + G_WIDTH / 160 + rad / 2), (int) (G_HEIGHT / 2 - G_HEIGHT / 80));
g2.drawString("0", (int) (G_WIDTH / 2 + G_WIDTH / 160), (int) (G_HEIGHT / 2 - G_HEIGHT / 80));
g2.setStroke(new BasicStroke(3)); // Изменение ширины линии
if (!squares.isEmpty()) {
ListIterator sqIter = squares.listIterator();
ListIterator stIter = states.listIterator();
for ( ; sqIter.hasNext() && stIter.hasNext(); ) {
switch ((States)stIter.next()) {
case InArea:
g2.setPaint(Color.RED);
break;
case NotInArea:
g2.setPaint(Color.BLUE);
break;
case NoResponse:
g2.setPaint(Color.BLACK);
break;
}
g2.draw((Shape) sqIter.next());
}
}
}
void add(Point2D p, States s) {
double x = p.getX();
double y = p.getY();
current = new Rectangle2D.Double(x, y, 1, 1);
squares.add(current); // Добавляем компонент current в контейнер
states.add(s);
repaint();
}
void repaintPoints(NPanel panel) {
Rectangle2D bufrec = new Rectangle2D.Double();
for (int i = 0; i < squares.size(); i++) {
bufrec = squares.get(i);
double nx = panel.setPixelX(((panel.setDecX(bufrec.getCenterX(), this))
* panel.getOldLogicRad() / panel.getLogicRad()), this) - 0.5;
double ny = panel.setPixelY(((panel.setDecY(bufrec.getCenterY(), this))
* panel.getOldLogicRad() / panel.getLogicRad()), this) - 0.5;
bufrec = new Rectangle2D.Double(nx, ny, 1, 1);
squares.set(i, bufrec);
repaint();
}
}
}
NPanel.java
package mainframe;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
public class NPanel extends javax.swing.JPanel {
// создание панели
public NPanel() {
initComponents();
this.setBackground(Color.LIGHT_GRAY); // Установка цвета
logicrad=3;
oldlogicrad=logicrad;
DefaultListModel model = new DefaultListModel();
model.addElement("-5");
model.addElement("-4");
model.addElement("-3");
model.addElement("-2");
model.addElement("-1");
model.addElement("0");
model.addElement("1");
model.addElement("2");
model.addElement("3");
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jTextField1 = new javax.swing.JTextField();
jLabel1 = new javax.swing.JLabel();
jTextField2 = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel();
jLabel7 = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton();
jScrollPane2 = new javax.swing.JScrollPane();
jList1 = new javax.swing.JList();
jLabel8 = new javax.swing.JLabel();
jTextField3 = new javax.swing.JTextField();
jTextField4 = new javax.swing.JTextField();
jTextField5 = new javax.swing.JTextField();
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
setMaximumSize(new java.awt.Dimension(32767, 15000));
setPreferredSize(new java.awt.Dimension(200, 500));
jTextField1.setEditable(false);
jTextField1.setHorizontalAlignment(javax.swing.JTextField.CENTER);
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel1.setText("X:");
jTextField2.setEditable(false);
jTextField2.setHorizontalAlignment(javax.swing.JTextField.CENTER);
jTextField2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField2ActionPerformed(evt);
}
});
jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel2.setText("Y:");
jLabel3.setText("Координаты точки:");
jLabel4.setText("Введите R:");
jLabel5.setText("Введите координаты:");
jLabel6.setText("Y:");
jLabel7.setText("X:");
jButton1.setText("OK");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jScrollPane2.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
jList1.setModel(new javax.swing.AbstractListModel() {
String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
public int getSize() { return strings.length; }
public Object getElementAt(int i) { return strings[i]; }
});
jScrollPane2.setViewportView(jList1);
jTextField3.setText("3");
jTextField4.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField4ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel4)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel3)
.addGap(19, 19, 19))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jTextField2, javax.swing.GroupLayout.DEFAULT_SIZE, 153, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 153, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addGap(119, 119, 119)
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE))))
.addGroup(layout.createSequentialGroup()
.addGap(30, 30, 30)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(10, 10, 10)
.addComponent(jLabel8))
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 119, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel5))
.addGroup(layout.createSequentialGroup()
.addGap(29, 29, 29)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(jLabel7)
.addComponent(jLabel6)
.addComponent(jTextField4)
.addComponent(jTextField5, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGroup(layout.createSequentialGroup()
.addGap(29, 29, 29)
.addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel1)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel2)
.addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addComponent(jLabel4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(13, 13, 13)
.addComponent(jLabel5)
.addGap(18, 18, 18)
.addComponent(jLabel7)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jLabel6)
.addGap(20, 20, 20)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jTextField5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(25, 25, 25)
.addComponent(jButton1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jLabel8)
.addGap(210, 210, 210))
);
}// </editor-fold>
void drawKoord(Point2D p, DrawComponent d)
{
this.jTextField1.setText(((setDecX(p.getX(), d))+" ").substring(0,5));
this.jTextField2.setText(((setDecY(p.getY(), d))+" ").substring(0,5));
}
private void jTextField2ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
private void jTextField4ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
public void setLogicRad(double r)
{
logicrad=r;
}
public double getLogicRad()
{
return logicrad;
}
public void setOldLogicRad(double r)
{
oldlogicrad=r;
}
public double getOldLogicRad()
{
return oldlogicrad;
}
double setDecX(double x, DrawComponent c)
{
double decx=(x-c.G_WIDTH/2)/(c.rad/getLogicRad());
return decx;
}
double setDecY(double y, DrawComponent c)
{
double decy=(c.G_HEIGHT/2-y)/(c.rad/getLogicRad());
return decy;
}
double setPixelX(double x, DrawComponent c)
{
double pixx=x*(c.rad/getLogicRad())+c.G_WIDTH/2;
return pixx;
}
double setPixelY(double y, DrawComponent c)
{
double pixy=-y*(c.rad/getLogicRad())+c.G_HEIGHT/2;
return pixy;
}
// Variables declaration - do not modify
javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
javax.swing.JLabel jLabel8;
javax.swing.JList jList1;
javax.swing.JScrollPane jScrollPane2;
javax.swing.JTextField jTextField1;
javax.swing.JTextField jTextField2;
javax.swing.JTextField jTextField3;
javax.swing.JTextField jTextField4;
javax.swing.JTextField jTextField5;
// End of variables declaration
private double logicrad;
private double oldlogicrad;
}