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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача двумерного массива через сокет 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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