Скачиваний:
73
Добавлен:
09.05.2014
Размер:
79.64 Кб
Скачать

Системы программирования Internet-приложений

Лабораторная работа #3

Вариант 137

Протокол - TCP

Работы выполнили

Голубцов Евгений

Пермяков Валерий

Группа 3100

2010

Лабораторная работа #3

По заданному номеру варианта и протоколу создать клиент-серверное приложение.

Сервер

Принимает запросы по заданному транспортному протоколу на выбранный порт. В запросе передаются параметры X,Y,R. Ответом сервера является признак попадания точки в область. Сервер должен использовать многопоточность - каждый запрос обрабатывается в отдельном потоке команд (Thread).

Клиент

Клиент должен представлять собой апплет, реализованный на основе приложения из л.р. №2. Ввод координат X,Y,R осуществляется при помощи клика мышки и текстовых полей. Апплет должен рисовать точку определенным цветом на основе ответа сервера. Если сервер недоступен - точка должна рисоваться третьим цветом.

Вопросы к защите лабораторной работы:

  1. Приложения и апплеты. Ограничения апплетов.

  2. Многопоточные программы. Концепции.

  3. Класс Thread и интерфейс Runnable.

  4. Состояние потока. Синхронизация потока.

  5. Межсетевое взаимодействие. Основные протоколы.

  6. Протокол TCP. Классы Socket и ServerSocket.

  7. Протокол UDP. Классы DatagramPacket и DatagramSocket.

  8. Потоки ввода-вывода. Иерархия.

Код программы:

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;

}

Соседние файлы в папке лабораторная работа 3