Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача двумерного массива через сокет 
:(
    Опции темы
CrasyMen
Дата 3.12.2007, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 264
Регистрация: 19.12.2006

Репутация: нет
Всего: 3



Надо передать int[][] mas3 от клиента серверу и обратно


Моя реализация (нерабочая конечно):
кусок кода клиента:
Код

Socket clientSocket;
            PrintWriter out = null;
            BufferedReader in = null;
            ObjectOutputStream oos1 = null;
            ObjectInputStream ois1 = null;
            try {
                clientSocket = new Socket("localhost", 5444);
                out = new PrintWriter(clientSocket.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(
                     clientSocket.getInputStream()));
                oos1 = new ObjectOutputStream(clientSocket.getOutputStream());
                ois1 = new ObjectInputStream(clientSocket.getInputStream());
            } catch (UnknownHostException e) {
                System.err.println("Don't know about host: localhost.");
                System.exit(1);
            } catch (IOException e) {
                System.err.println("Couldn't get I/O for "
                                   + "the connection to: localhost.");
                System.exit(1);
            }
            System.out.println("socket created");
            
            try {
                oos1.writeObject(mas1);
                oos1.flush();
                mas3 = (int[][])ois1.readObject();
            } catch (IOException e) {
                System.err.println("Troubles in transfer");
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                System.err.println("Troubles in ...");
            }
            System.out.println("Done");


код сервера целиком:
Код

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

public class MyServer {
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(5544); 
        System.out.println("i'm waiting for connection");
        Socket s;
        int[][] mas3 = null;
        s = ss.accept(); // сокет s, готовий до прийому
        InputStream is = s.getInputStream(); // вхідний потік сокета
        OutputStream os = s.getOutputStream();
        ObjectInputStream ois = new ObjectInputStream(is);
        ObjectOutputStream oos = new ObjectOutputStream(os);
        mas3 = (int[][]) ois.readObject(); 
        Arrays.fill(mas3, 5);
        oos.writeObject(mas3); 
        oos.flush();
        System.out.println("All ok!!!");
    }
}


Добавлено через 2 минуты и 43 секунды
на всякий случай, вот код клиента целиком:
Код

import java.io.*;
import java.net.*;
import java.util.Random;
import java.awt.event.*;
import javax.swing.*;

public class MyClient extends JFrame {
    public MyClient() {
        super("MyClient");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel contents = new JPanel();

        JLabel label1 = new JLabel("Параметри першої матриці:");
        JLabel label2 = new JLabel("х=");
        JTextField textField1 = new JTextField("2", 5);
        JLabel label3 = new JLabel("у=");
        final JTextField textField2 = new JTextField("10", 5);
        JLabel label4 = new JLabel("Параметри другої матриці:");
        JLabel label5 = new JLabel("х=");
        final JTextField textField3 = new JTextField("10", 5);
        JLabel label6 = new JLabel("у=");
        JTextField textField4 = new JTextField("10", 5);
        JButton button = new JButton("OK");

        contents.add(label1);
        contents.add(label2);
        contents.add(textField1);
        contents.add(label3);
        contents.add(textField2);
        contents.add(label4);
        contents.add(label5);
        contents.add(textField3);
        contents.add(label6);
        contents.add(textField4);
        contents.add(button);

        int x1, y1, x2, y2;
        x1 = Integer.valueOf(textField1.getText());
        y1 = Integer.valueOf(textField2.getText());
        x2 = Integer.valueOf(textField3.getText());
        y2 = Integer.valueOf(textField4.getText());

        button.addActionListener(new ButtonListener(x1, y1, x2, y2));
        setContentPane(contents);
        setSize(180, 170);
        setVisible(true);
    }

    public static void main(String[] args) {
        new MyClient();
    }

    public class ButtonListener implements ActionListener {
        ButtonListener(int x1, int y1, int x2, int y2) {
            this.x1 = x1;
            this.y1 = y1;
            this.x2 = x2;
            this.y2 = y2;
            mas1 = new int[x1][y1];
            mas2 = new int[x2][y2];
            mas3 = new int[x3][y3];
        }

        public void actionPerformed(ActionEvent arg0) {
            Random r = new Random();

            for (int i = 0; i < mas1.length; i++) {
                for (int j = 0; j < mas1[i].length; j++) {
                    mas1[i][j] = r.nextInt(10);
                }
            }
            for (int i = 0; i < mas2.length; i++) {
                for (int j = 0; j < mas2[i].length; j++) {
                    mas2[i][j] = r.nextInt(10);
                }
            }

            Socket clientSocket;
            PrintWriter out = null;
            BufferedReader in = null;
            ObjectOutputStream oos1 = null;
            ObjectInputStream ois1 = null;
            try {
                clientSocket = new Socket("localhost", 5444);
                out = new PrintWriter(clientSocket.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(
                     clientSocket.getInputStream()));
                oos1 = new ObjectOutputStream(clientSocket.getOutputStream());
                ois1 = new ObjectInputStream(clientSocket.getInputStream());
            } catch (UnknownHostException e) {
                System.err.println("Don't know about host: localhost.");
                System.exit(1);
            } catch (IOException e) {
                System.err.println("Couldn't get I/O for "
                                   + "the connection to: localhost.");
                System.exit(1);
            }
            System.out.println("socket created");
            
            try {
                oos1.writeObject(mas1);
                oos1.flush();
                mas3 = (int[][])ois1.readObject();
            } catch (IOException e) {
                System.err.println("Troubles in transfer");
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                System.err.println("Troubles in ...");
            }
            System.out.println("Done");

            try {
                out = new PrintWriter(new BufferedWriter(
                        new FileWriter("mas3.txt")));
                for (int i = 0; i < mas3.length; i++) {
                    for (int j = 0; j < mas3[i].length; j++) {
                        out.println(mas3[i][j]);
                    }
                }
                out.close();
            } catch (IOException er) {
                System.out.println(er);
            }
        }

        String file;
        int x1, y1, x2, y2, x3, y3;
        int[][] mas1;
        int[][] mas2;
        int[][] mas3;
    }
}
 


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
sith
Дата 3.12.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: 1
Всего: 1



smile очень много лишнего кода...  ну смотри я думаю что подход правельный ты выбрал ... кидаться обьектами... только твой масив приметивных типов нужно  было бы обернуть вдругой класс... примерно... так... 

Код

public void TransferObject extends Serializable{
private int[][]  mass;
/**делаешь здесь два метода  get и  set, через них будешь получать и устанавливать значения масива*/
}


... в сервере отправляешь этот обьект... а в клиенте читаешь обьетк из потока и приводишь к этому типу...  ну а потом метод  get  вытягиваешь свой массив

... если не получиться выкладывай код  будем смотреть... 


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
CrasyMen
Дата 3.12.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 264
Регистрация: 19.12.2006

Репутация: нет
Всего: 3



а разве массив нельзя  использовать как объект? 


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
sith
Дата 3.12.2007, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: 1
Всего: 1



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


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
CrasyMen
Дата 3.12.2007, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 264
Регистрация: 19.12.2006

Репутация: нет
Всего: 3



Пожалуйста, подкорректируйте мой код чтобы 
Цитата(CrasyMen @  3.12.2007,  18:32 Найти цитируемый пост)
передать int[][] mas3 от клиента серверу и обратно

или хотя бы приведите кусок кода, который осуществляет это
Заранее благодарю (не забуду нажать "+")


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
LSD
Дата 3.12.2007, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



1. Массивы - это объекты.
2. Массивы сами по себе сереализуемы. Вопрос только в том, что за данные в них лежат.

Какие нибудь эксепшены во время работы выскакивают?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
CrasyMen
Дата 4.12.2007, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 264
Регистрация: 19.12.2006

Репутация: нет
Всего: 3



Цитата(LSD @  3.12.2007,  23:57 Найти цитируемый пост)
Какие нибудь эксепшены во время работы выскакивают? 

Вот что в стандартном потоке вывода (консоле):
Цитата

socket created
Troubles in transfer
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.ObjectInputStream$PeekInputStream.peek(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.peek(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at MyClient$ButtonListener.actionPerformed(MyClient.java:103)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Done



Добавлено через 46 секунд
не знаю как это побороть

Добавлено через 3 минуты и 1 секунду
может в передаваемом массиве вместо примитивного типа использовать класс Integer?


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
sith
Дата 4.12.2007, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: 1
Всего: 1



и так.... выкладываю... 

...код обьекта который будем передавать по сети
Код

import java.io.*;

public class TransferObject implements Serializable{
    private int[][] mas;


    public TransferObject() {
        mas = new int[3][3];
        for (int i = 0; i < mas.length; i++) {
            for (int j = 0; j < mas.length; j++) {
                mas[i][j] = i+j;
            }
        }
    }

    public int[][] getMassive(){
        return mas;
    }
}


... код клиента
Код
import java.net.Socket;
import java.io.*;


public class Client {
    public Client() {

    }

    public static void main(String[] args) {
        try {
            TransferObject object = new TransferObject();
            Socket s = new Socket("localhost",6001);
             InputStream is = s.getInputStream(); // вхідний потік сокета
        OutputStream os = s.getOutputStream();

        ObjectOutputStream oos = new ObjectOutputStream(os);
            oos.writeObject(object);
            oos.flush();
           // oos.close();
         ObjectInputStream ois = new ObjectInputStream(is);
              object = (TransferObject) ois.readObject();


            int[][] recivedMas = object.getMassive();
            for (int i = 0; i < recivedMas.length; i++) {
                for (int j = 0; j < recivedMas.length; j++) {
                    int i1 = recivedMas[i][j];
                    System.out.println("[" + i + "][ " + j + "] " + i1);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (ClassNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }


... код сервера
Код
import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;


public class Server {

    public Server() {
    }

    public static void main(String[] args) {


        try {
            ServerSocket serverSocket = new ServerSocket(6001);
            Socket s = serverSocket.accept();

        InputStream is = s.getInputStream(); // вхідний потік сокета
        OutputStream os = s.getOutputStream();
        ObjectInputStream ois = new ObjectInputStream(is);
        //ObjectOutputStream oos = new ObjectOutputStream(os);

            TransferObject object = (TransferObject) ois.readObject();


            int[][] recivedMas = object.getMassive();
            for (int i = 0; i < recivedMas.length; i++) {
                for (int j = 0; j < recivedMas.length; j++) {
                    int i1 = recivedMas[i][j];
                    System.out.println("[" + i + "][ " + j + "] " + i1);
                }
            }
         ObjectOutputStream oos = new ObjectOutputStream(os);
            oos.writeObject(object);
            oos.flush();
        } catch (
                IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (ClassNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
}



... у меня работает

Добавлено через 4 минуты и 32 секунды
слушай... я в этот пример подставил обычный двух мерный масив вместо своего обьекта и тоже все работает...


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
serger
Дата 4.12.2007, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: нет
Всего: 5



Я конечно не знаю для чего это всё нужно, но через сериализацию, по моему, это делать не стоит.. потом проблемы будут.


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
sith
Дата 4.12.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: 1
Всего: 1



... почему будут проблемы...? 


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
CrasyMen
Дата 4.12.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 264
Регистрация: 19.12.2006

Репутация: нет
Всего: 3



Цитата(sith @  4.12.2007,  00:36 Найти цитируемый пост)
слушай... я в этот пример подставил обычный двух мерный масив вместо своего обьекта и тоже все работает... 

покажи код (лучше целиком), пожалуйста

Добавлено через 1 минуту и 14 секунд
у мну SocketException выпрыгивает  smile 


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
sith
Дата 4.12.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: 1
Всего: 1



... а какой Exception... выбрасывает...?

Добавлено через 18 секунд
выложи printStackTrace


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
CrasyMen
Дата 4.12.2007, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 264
Регистрация: 19.12.2006

Репутация: нет
Всего: 3



Цитата(sith @  4.12.2007,  14:06 Найти цитируемый пост)
... а какой Exception... выбрасывает...?

SocketException
Цитата(sith @  4.12.2007,  14:06 Найти цитируемый пост)
выложи printStackTrace

я не сохранял изменений в проекте

я думаю что можно обойтись без "обьекта который будем передавать по сети" aka TransferObject путем подмены вместо примитивного типа int классом Integer, который наследует интерфейс Serializable (посмотрел джавадоке)
Немогу наладить передачу Integer[][] по сети. Наверно клинит.

Цитата(sith @  4.12.2007,  00:36 Найти цитируемый пост)
слушай... я в этот пример подставил обычный двух мерный масив вместо своего обьекта и тоже все работает... 

выложи код, плз, или с Integer[][] или с int[][] но по возможности без TransferObject

Это сообщение отредактировал(а) CrasyMen - 4.12.2007, 15:07


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
captcha
Дата 4.12.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Зачем перед получением потока еще получается Writer?
Один сокет - один канал. Тем более ObjectStream.
Уберите writer, все должно работать.
PM MAIL   Вверх
sith
Дата 4.12.2007, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: 1
Всего: 1



сервер
Код

import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;


public class Server {

    public Server() {
    }

    public static void main(String[] args) {


        try {
            ServerSocket serverSocket = new ServerSocket(6001);
            Socket s = serverSocket.accept();

            InputStream is = s.getInputStream(); // вхідний потік сокета
            OutputStream os = s.getOutputStream();
            ObjectInputStream ois = new ObjectInputStream(is);

            int[][] recivedMas = (int[][]) ois.readObject();
            for (int i = 0; i < recivedMas.length; i++) {
                for (int j = 0; j < recivedMas.length; j++) {
                    int i1 = recivedMas[i][j];
                    System.out.println("[" + i + "][ " + j + "] " + i1);
                }
            }
            ObjectOutputStream oos = new ObjectOutputStream(os);
            oos.writeObject(recivedMas);
            oos.flush();
        } catch (
                IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (ClassNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
}


клиент
Код

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

/**
 * Created by IntelliJ IDEA.
 * User: sith
 * Date: 03.12.2007
 * Time: 22:52:44
 * To change this template use File | Settings | File Templates.
 */
public class Client {
    public Client() {

    }

    public static void main(String[] args) {
        try {
            int[][] mas = new int[3][3];
            for (int i = 0; i < mas.length; i++) {
                for (int j = 0; j < mas.length; j++) {
                    mas[i][j] = i + j;
                }
            }
            Socket s = new Socket("localhost", 6001);
            InputStream is = s.getInputStream(); // вхідний потік сокета
            OutputStream os = s.getOutputStream();

            ObjectOutputStream oos = new ObjectOutputStream(os);
            oos.writeObject(mas);
            oos.flush();
            // oos.close();
            ObjectInputStream ois = new ObjectInputStream(is);

            int[][] recivedMas = (int[][]) ois.readObject();
            for (int i = 0; i < recivedMas.length; i++) {
                for (int j = 0; j < recivedMas.length; j++) {
                    int i1 = recivedMas[i][j];
                    System.out.println("[" + i + "][ " + j + "] " + i1);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (ClassNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }

}



... должен работать


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
serger
Дата 5.12.2007, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: нет
Всего: 5



Цитата(sith @ 4.12.2007,  11:38)
... почему будут проблемы...?

для внутреннего пользования мож и прокатит, но не уневерсально..
Заберёт на себя все проблемы сериализации..

Для банальной передачи массива имхо с другой строны лишнее..

Хотя, повторюсь, я не знаю задачи.


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
sith
Дата 5.12.2007, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: 1
Всего: 1



... а какие у сериализации проблемы... ?


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
LSD
Дата 5.12.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



И изначальном коде проблема в том, что сервер работает на 5544, а клиент на 5444.
И проблема в методе Arrays.fill() он не умеет заполнять двумерные массивы, надо писать так:
Код

for(int[] ints : mas3)
  Arrays.fill(ints, 5);



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
CrasyMen
Дата 5.12.2007, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 264
Регистрация: 19.12.2006

Репутация: нет
Всего: 3



Заработало! Всем спасибо, особенно sithу (см. репутацию).

С простой передачей массива через сокет разобрался. Ещё вопрос: 
будет один клиент и четыре сервера. Исходный массив (инициализация и заполнение в клиенте) делится на 4 части (для каждого сервера по одной). Каждый сервер должен принимать, обрабатывать (арифметические операции) и отправлять назад клиенту свою часть массива. Как всё это лучше реализовать? (ну типо многопоточно или нет и т.д.)

P.S. Может пополнить этим примером раздел "Исходники", когда он будет закончен и оптимизирован?


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
sith
Дата 5.12.2007, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: 1
Всего: 1



наверно можно без многопоточности...  просто на клиенте делаешь четыре сокет соеденинеия передаешь в каждом сокете нужные части масива...  и принимаешь ответы... все аналогично этому примеру


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
serger
Дата 6.12.2007, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: нет
Всего: 5



Ну хотя бы...
http://skipy.ru/technics/serialization.html
Часть проблем описана тут.
Не могу найти статью, где были описаны за и против... Чтоб так сказать красивым языком...

ps
А суть, что мне не нравиться, что передаётся не сложная логика или набор данных, а банальный массив.


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
CrasyMen
Дата 6.12.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 264
Регистрация: 19.12.2006

Репутация: нет
Всего: 3



Цитата(LSD @ 5.12.2007,  13:34)
И проблема в методе Arrays.fill() он не умеет заполнять двумерные массивы, надо писать так:
Код

for(int[] ints : mas3)
  Arrays.fill(ints, 5);

для новичка читающего самоучитель (jdk 1.4) не совсем понятна эта конструкция. Объясните, плз, или скажите где об этом почитать.

Добавлено через 9 минут и 44 секунды
знаю что в jdk 1.5 появилась фича для работы с коллекциями в циклах (Видел как-то в книге Шидлта "Java 1.5. Новые возможности"). Это оно?


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
SoulKeeper
Дата 6.12.2007, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: нет
Всего: 15



Цитата(CrasyMen @  6.12.2007,  19:59 Найти цитируемый пост)
для новичка читающего самоучитель (jdk 1.4) не совсем понятна эта конструкция. Объясните, плз, или скажите где об этом почитать.


=

Код

for(int i = 0; i < mas3.length; i++)
{
int[] ints = mas3[i];
Arrays.fill(ints, 5);
}

PM MAIL   Вверх
CrasyMen
Дата 6.12.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 264
Регистрация: 19.12.2006

Репутация: нет
Всего: 3



Цитата(sith @  5.12.2007,  11:46 Найти цитируемый пост)
... а какие у сериализации проблемы... ? 

наткнулся случайно:
Цитата

Сериализация (Serialization) является встроенным механизмом хранения и передачи объектов в Java. Но для практической работы с данными данный подход мало пригоден, так как требуется извлекать и хранить весь граф объектов, что затрудняет работу с большими объемами данных.

статья лежит здесь


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
Kangaroo
Дата 6.12.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 2
Всего: 104



Цитата(CrasyMen @  6.12.2007,  18:59 Найти цитируемый пост)
для новичка читающего самоучитель (jdk 1.4) 

а зачем читать 1.4, если уже 1.6 ?


--------------------
Lost....
PM MAIL MSN   Вверх
CrasyMen
Дата 6.12.2007, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 264
Регистрация: 19.12.2006

Репутация: нет
Всего: 3



Цитата(Kangaroo @  6.12.2007,  22:25 Найти цитируемый пост)
а зачем читать 1.4, если уже 1.6 ? 

В скорых планах читать Еккеля. По 1.6 практически нет книжек в електронном виде.


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
Kangaroo
Дата 6.12.2007, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 2
Всего: 104



Цитата(CrasyMen @  6.12.2007,  22:44 Найти цитируемый пост)
По 1.6 практически нет книжек в електронном виде. 

Да я больше имел ввиду 1.5.. в 1.5 произошло много существенных и полезных изменений


--------------------
Lost....
PM MAIL MSN   Вверх
LSD
Дата 7.12.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Ну хотябы тут.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
CrasyMen
Дата 10.12.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 264
Регистрация: 19.12.2006

Репутация: нет
Всего: 3



работает

код клиента
Код

import java.io.*;
import java.net.*;
import java.util.Random;
import java.awt.event.*;
import javax.swing.*;

public class MyClient extends JFrame {
    public MyClient() {
        super("MyClient");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel contents = new JPanel();

        JLabel label1 = new JLabel("Parameters of the first matrix:");
        JLabel label2 = new JLabel("х=");
        JTextField textField1 = new JTextField("100", 5);
        JLabel label3 = new JLabel("у=");
        JTextField textField2 = new JTextField("100", 5);
        JLabel label4 = new JLabel("Parameters of the second matrix:");
        JLabel label5 = new JLabel("х=");
        JTextField textField3 = new JTextField("100", 5);
        JLabel label6 = new JLabel("у=");
        JTextField textField4 = new JTextField("100", 5);
        JButton button = new JButton("OK");

        contents.add(label1);
        contents.add(label2);
        contents.add(textField1);
        contents.add(label3);
        contents.add(textField2);
        contents.add(label4);
        contents.add(label5);
        contents.add(textField3);
        contents.add(label6);
        contents.add(textField4);
        contents.add(button);

        //appropriation of value of the fields of Jtextfield to the variables of x1, y1, x2 and y2, which
        //then will be passed in the designer of class of Buttonlistener
        int x1, y1, x2, y2;
        x1 = Integer.valueOf(textField1.getText());
        y1 = Integer.valueOf(textField2.getText());
        x2 = Integer.valueOf(textField3.getText());
        y2 = Integer.valueOf(textField4.getText());

        button.addActionListener(new ButtonListener(x1, y1, x2, y2));
        setContentPane(contents);
        setSize(180, 170);
        setVisible(true);
    }

    public static void main(String[] args) {
        new MyClient();
    }

    public class ButtonListener implements ActionListener {
        ButtonListener(int x1, int y1, int x2, int y2) {
            this.x1 = x1;
            this.y1 = y1;
            this.x2 = x2;
            this.y2 = y2;
            mas1 = new int[x1][y1];        //
            mas2 = new int[x2][y2];        //
            mas3 = new int[x2][y2];        //mas3 must have the same sizes as well as mas2
        }

        public void actionPerformed(ActionEvent arg0) {
            Random r = new Random();
            
            //fill the arrays of mas1 and mas2 by random numbers in a range from 0 to 10
            for (int i = 0; i < x1; i++) {
                for (int j = 0; j < y1; j++) {
                    mas1[i][j] = r.nextInt(10);
                }
            }
            for (int i = 0; i < x2; i++) {
                for (int j = 0; j < y2; j++) {
                    mas2[i][j] = r.nextInt(10);
                }
            }
            
            //divisible array of mas2 on four parts and appropriate them the names
            for (int i = 0; i < subMas1.length; i++) {
                for (int j = 0; j < subMas1[0].length; j++) {
                    subMas1[i][j] = mas2[i][j];
                    subMas2[i][j] = mas2[i][j+25];
                    subMas3[i][j] = mas2[i][j+50];
                    subMas4[i][j] = mas2[i][j+75];
                }
            }
            
            try {
                Socket clientSocket;
                PrintWriter out = null;
                BufferedReader in = null;
                Socket s1 = new Socket("localhost", 6001);
             Socket s2 = new Socket("localhost", 6002);
             Socket s3 = new Socket("localhost", 6003);
             Socket s4 = new Socket("localhost", 6004);
                InputStream is1 = s1.getInputStream();
                InputStream is2 = s2.getInputStream();
                InputStream is3 = s3.getInputStream();
                InputStream is4 = s4.getInputStream();
                OutputStream os1 = s1.getOutputStream();
                OutputStream os2 = s2.getOutputStream();
                OutputStream os3 = s3.getOutputStream();
                OutputStream os4 = s4.getOutputStream();
                ObjectOutputStream oos1 = new ObjectOutputStream(os1);
                ObjectOutputStream oos2 = new ObjectOutputStream(os2);
                ObjectOutputStream oos3 = new ObjectOutputStream(os3);
                ObjectOutputStream oos4 = new ObjectOutputStream(os4);
                oos1.writeObject(mas1);
                oos2.writeObject(mas1);
                oos3.writeObject(mas1);
                oos4.writeObject(mas1);
                oos1.writeObject(subMas1);
                oos2.writeObject(subMas2);
                oos3.writeObject(subMas3);
                oos4.writeObject(subMas4);
                oos1.flush();
                oos2.flush();
                oos3.flush();
                oos4.flush();
                ObjectInputStream ois1 = new ObjectInputStream(is1);
                ObjectInputStream ois2 = new ObjectInputStream(is2);
                ObjectInputStream ois3 = new ObjectInputStream(is3);
                ObjectInputStream ois4 = new ObjectInputStream(is4);
                
                //take over servers
                int[][] recivedMas1 = (int[][]) ois1.readObject();
                int[][] recivedMas2 = (int[][]) ois2.readObject();
                int[][] recivedMas3 = (int[][]) ois3.readObject();
                int[][] recivedMas4 = (int[][]) ois4.readObject();
                
                //fold four parts in one array
                for (int i = 0; i < subMas1.length; i++) {
                    for (int j = 0; j < (subMas1[i].length); j++) {
                        mas3[i][j] = recivedMas1[i][j];
                        mas3[i][j+25] = recivedMas2[i][j];
                        mas3[i][j+50] = recivedMas3[i][j];
                        mas3[i][j+75] = recivedMas4[i][j];
                    }
                }
                
                //a conclusion of three arrays is in the file of three arrays
                String file = new String("array.txt");
                PrintWriter fileOut = new PrintWriter(new BufferedWriter(new FileWriter(file)));
                fileOut.println("mas1:");
                for (int i = 0; i < mas1.length; i++) {    
                    for (int j = 0; j < mas1[i].length; j++) {
                        fileOut.print("\t" + mas1[i][j]);
                    }
                    fileOut.println();
                }
                fileOut.println("mas2:");
                for (int i = 0; i < mas2.length; i++) {    
                    for (int j = 0; j < mas2[i].length; j++) {
                        fileOut.print("\t" + mas2[i][j]);
                    }
                    fileOut.println();
                }
                fileOut.println("mas3:");
                for (int i = 0; i < mas3.length; i++) {    
                    for (int j = 0; j < mas3[i].length; j++) {
                        fileOut.print("\t" + mas3[i][j]);
                    }
                    fileOut.println();
                }
                fileOut.close();
                
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            System.out.println("Done");
        }

        String file;            //file which a conclusion is in
        int x1, y1, x2, y2;        //rows (х) and columns (у) of the first and second matrices
        int[][] mas1;        //first matrix        
        int[][] mas2;        //second matrix    
        int[][] mas3;        //matrix which received from servers                
        int[][] subMas1 = new int[100][25];        //part of array mas2, which is passed on the first server
        int[][] subMas2 = new int[100][25];        //part of array mas2, which is passed on the second server
        int[][] subMas3 = new int[100][25];        //part of array mas2, which is passed on the third server
        int[][] subMas4 = new int[100][25];        //part of array mas2, which is passed on the fourth server
    }
}

код сервера №1: (Код серверов № 2, 3 и 4 такой же, кроме номеров портов)
Код

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

public class MyServer1 {
    public static void main(String[] args) throws Exception {
        System.out.println("MyServer1 waiting for connection");
        try {
            ServerSocket serverSocket = new ServerSocket(6001);
            Socket s = serverSocket.accept();
            InputStream is = s.getInputStream();    //input stream of socket
            OutputStream os = s.getOutputStream();
            ObjectInputStream ois = new ObjectInputStream(is);
            int[][] recivedMas1 = (int[][]) ois.readObject();    //accept arrays        
            int[][] recivedMas2 = (int[][]) ois.readObject();    //    from a client
            int[][] calculateMas = new int[recivedMas2.length][recivedMas2[0].length];    //resulting array
            
            //realization of arithmetic operations
            for (int i = 0; i < recivedMas2.length; i++) {
                for (int j = 0; j < recivedMas2[i].length; j++) {
                 for (int w = 0; w < recivedMas2.length; w++) {
                     calculateMas[i][j] += recivedMas1[i][w]*recivedMas2[w][j];
                 }
                }
            }
            
            ObjectOutputStream oos = new ObjectOutputStream(os);    
            oos.writeObject(calculateMas);        //sending of result is to the client
            oos.flush();
        } catch (IOException e) {
            e.printStackTrace();  
        } catch (ClassNotFoundException e) {
            e.printStackTrace();  
        }
        System.out.println("All ok!!!");
    }
}



Много повторяющегося кода. Нужны советы по оптимизации кода. Или еще лучше, переделайте полностью, плз. Посмотрю как надо делать и вторую лабу (почти такую же, но вместо операций с матрицами будут интегралы) сделаю сам.

Заранее благодарю. Добавлю +1


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.1390 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.