LINUX.ORG.RU

Сообщения dr_mariarti

 

Java seriarizable + socket

Форум — Development

Добрый день! Пилю я тут в целях самообразования многопоточный сервер сообщений («ненужно!»), предполагаю передавать данные от клиента серверу и обратно как сериализованные объекты. Но что то ниего не получается. Строки и даты - получается, свои объекты - нет. Делаю все это впервые. Полностью проект на гитхабе
Основная часть сервера

package org.svgroz.client_listner;

import org.svgroz.notification.IObserver;
import org.svgroz.notification.ISubject;

import java.io.*;
import java.net.Socket;
import java.util.Date;

import org.apache.log4j.Logger;

public class ClientListener extends Thread implements IObserver {
    private Socket client;
    private ISubject subject;
    private Logger logger;

    public ClientListener(Socket client, ISubject subject) {
        this.client = client;
        this.subject = subject;
        logger = Logger.getLogger(ClientListener.class.getName());
    }

    public void update(String message){
        try {
            PrintWriter writer = new PrintWriter(client.getOutputStream(), true);
            writer.println(message);
        }
        catch (Exception exception) {
            logger.error(exception.getMessage());
        }
    }

    @Override
    public void run () {
        try {
            ObjectInputStream objectInputStream = new ObjectInputStream(client.getInputStream());
            Date message;
            while ((message = (Date)objectInputStream.readObject()) != null) {
                logger.info(message);
            }
            objectInputStream.close();
            this.subject.removeObserver(this);
        }
        catch (IOException exception) {
            logger.warn(exception.getMessage());
        }
        catch (Exception exception) {
            logger.error(exception.getMessage());
            exception.printStackTrace();
        }
        finally {
            try{
                client.close();
                logger.info("Connection closed");
            } catch (IOException exception){
                logger.error(exception.getMessage());
            }
        }
    }
}
Ну и простой клиент.
package org.svgroz;

import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.channels.SocketChannel;
import java.util.Date;

public class EchoClient {
    public static void main(String[] args) throws IOException {

        String hostName = "localhost";
        int portNumber = 4444;

        try{
            SocketChannel socketChannel = SocketChannel.open();
            socketChannel.connect(new InetSocketAddress(hostName, portNumber));
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(socketChannel.socket().getOutputStream());
            Date message = new Date();
            Thread.sleep(1000);
            objectOutputStream.writeObject(message);
        } catch (Exception e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
    }
}

dr_mariarti
()

Тестовое задание, где я ошибся?

Форум — Development

Добрый день. Решил я тут отправить резюме в компанию N и выполнить их тестовое задание. Само задание

Есть интерфейс:

public interface Rtriangle {
int getApexX1();
int getApexY1();
int getApexX2();
int getApexY2();
int getApexX3();
int getApexY3();
}

Методы возвращают 6 чисел — координаты трех вершин прямоугольного треугольника в декартовой системе координат.

Есть метод, возвращающий прямоугольный треугольник:

public final class RtriangleProvider {
public static Rtriangle getRtriangle() {
...
}
}

Напишите код junit теста, который будет проверять, действительно ли метод 
getRtriangle возвращает прямоугольный треугольник.
А вот jUnit тест
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mariarti.Rtriangle;
import org.mariarti.RtriangleProvider;

import java.util.*;

public class T_Rtriangle {
    private Rtriangle rtriangle = RtriangleProvider.getRtriangle();
    private int
            x1 = rtriangle.getApexX1(),
            y1 = rtriangle.getApexY1(),
            x2 = rtriangle.getApexX2(),
            y2 = rtriangle.getApexY2(),
            x3 = rtriangle.getApexX3(),
            y3 = rtriangle.getApexY3();
    private double
            sideTriangleA,
            sideTriangleB,
            sideTriangleC;
    private final static double delta = 0.0000000001;
    private List<Double> legs = new ArrayList<>();

    @Before
    public void initTest(){
        legs.add(getLength(x1, y1, x2, y2));
        legs.add(getLength(x2, y2, x3, y3));
        legs.add(getLength(x3, y3, x1, y1));
        Collections.sort(legs);
        sideTriangleA = legs.get(0);
        sideTriangleB = legs.get(1);
        sideTriangleC = legs.get(2);
    }

    public double getLength(int x1, int y1, int x2, int y2){
        return Math.sqrt(Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2));
    }

    @Test
    public void ACosTest(){
        double angleA = Math.acos(
                (Math.pow(sideTriangleB, 2) + Math.pow(sideTriangleC, 2) - Math.pow(sideTriangleA, 2))
                    / (2 * sideTriangleB * sideTriangleC));
        double angleB = Math.acos(
                (Math.pow(sideTriangleA, 2) + Math.pow(sideTriangleC, 2) - Math.pow(sideTriangleB, 2))
                    / (2 * sideTriangleA * sideTriangleC));
        double angleC = Math.acos(-1) - (angleA + angleB);
        Assert.assertEquals(Math.acos(0), angleC, delta);
    }

}
И меня слили. Господа, в чем я ошибся? Не могу ни спать ни есть пока не найду объяснений.

dr_mariarti
()

RSS подписка на новые темы