С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 30.01.2010
Сообщений: 10

Сокеты: передача на несколько адресов

16.02.2010, 18:47. Показов 1909. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здравствуйте. мне нужно выполнить передачу нескольких объектов (чисел и массивов) с клиента на 3 сервера. изначально делал это так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
try {
    Socket[] s=new Socket[6];
    s[0] = new Socket(ipAdd, 3128);
    ObjectOutputStream out1 = new ObjectOutputStream(s[0].getOutputStream());
    s[1] = new Socket(ipAdd, 3129);
    ObjectInputStream in1 = new ObjectInputStream(s[1].getInputStream());
    out1.writeShort(m);
    out1.flush();
    out1.writeInt(n);
    out1.flush();
    out1.writeObject(b1);
    out1.flush();
    out1.writeObject(c);
    out1.flush();
 
    s[2] = new Socket(ipAdd, 3130);
    ObjectOutputStream out2 = new ObjectOutputStream(s[2].getOutputStream());
    s[3] = new Socket(ipAdd, 3131);
    ObjectInputStream in2 = new ObjectInputStream(s[3].getInputStream());
    out2.writeShort(m);
    out2.flush();
    out2.writeInt(n);
    out2.flush();
    out2.writeObject(b2);
    out2.flush();
    out2.writeObject(c);
    out2.flush();   
 
    s[4] = new Socket(ipAdd, 3132);
    ObjectOutputStream out3 = new ObjectOutputStream(s[4].getOutputStream());
    s[5] = new Socket(ipAdd, 3133);
    ObjectInputStream in3 = new ObjectInputStream(s[5].getInputStream());
    out3.writeShort(m);
    out3.flush();
    out3.writeInt(n);
    out3.flush();
    out3.writeObject(b3);
    out3.flush();
    out3.writeObject(c);
    out3.flush();
}
catch(Exception e)
{System.out.println("init error: "+e);}
всё работает, но при таком способе данные отправляются последовательно сначала на сервер 1, потом на 2 и 3, что при большом объёме данных выглядит не очень красиво и вообще.
чтобы данные отправлялись на серверы одновременно, пытаюсь запихнуть всё в потоки следующим образом:


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
sender1 sd1=new sender1(z);
sender2 sd2=new sender2(z);
sender3 sd3=new sender3(z);
sd1.start();
sd2.start();
sd3.start();
 
//////////////
 
public class sender1 extends Thread
{
    data z;
    public sender1(data q) 
    {z=q;}
    public void run()
    {
        Socket[] s01=new Socket[2];
        try 
        {
            s01[0] = new Socket(ipAdd, 3128);
            ObjectOutputStream out1 = new ObjectOutputStream(s01[0].getOutputStream());
            out1.writeShort(m);
            out1.flush();
            s01[1] = new Socket(ipAdd, 3129);
            ObjectInputStream in1 = new ObjectInputStream(s01[1].getInputStream());
            out1.writeInt(n);
            out1.flush();
            out1.writeObject(b1);
            out1.flush();
            out1.writeObject(c);
            out1.flush();
        }
        catch(Exception e)
        {System.out.println("init error: "+e);}
    }
}
 
public class sender2 extends Thread
{
    data z;
    public sender2(data q) 
    {z=q;}
    public void run()
    {
        Socket[] s02=new Socket[2];
        try 
        {
            s02[0] = new Socket(ipAdd, 3130);
            ObjectOutputStream out2 = new ObjectOutputStream(s02[0].getOutputStream());
            s02[1] = new Socket(ipAdd, 3131);
            ObjectInputStream in2 = new ObjectInputStream(s02[1].getInputStream());
            out2.writeShort(m); 
            out2.flush();
            out2.writeInt(n);
            out2.flush();
            out2.writeObject(b2);
            out2.flush();
            out2.writeObject(c);
            out2.flush();   
        }
        catch(Exception e)
        {System.out.println("init error: "+e);}
    }
}
 
public class sender3 extends Thread
{
    data z;
    public sender3(data q) 
    {z=q;}
    public void run()
    {
        Socket[] s03=new Socket[2];
        try 
        {
            s03[0] = new Socket(ipAdd, 3132);   
            ObjectOutputStream out3 = new ObjectOutputStream(s03[0].getOutputStream());
            s03[1] = new Socket(ipAdd, 3133);
            ObjectInputStream in3 = new ObjectInputStream(s03[1].getInputStream());
            out3.writeShort(m);
            out3.flush();
            out3.writeInt(n);
            out3.flush();
            out3.writeObject(b3);
            out3.flush();
            out3.writeObject(c);
            out3.flush();
        }
        catch(Exception e)
        {System.out.println("init error: "+e);}
    }
}
вроде бы смысл тот же, но на деле получается такое: один сервер (случайный) принимает данные корректно, на остальных двух:
java.lang.NullPointerException:

at java.io.ObjectInputStream.readObject()
at server.SampleServer.run()

если оставить отправку только на один сервер, он принимает всё нормально. пожалуйста, подскажите где у меня ошибка.
или, может, существуют другие способы передачи данных на несколько адресов сразу?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.02.2010, 18:47
Ответы с готовыми решениями:

Передача файлов через сокеты
Всем привет. Нужно передать файлы с клиента на сервер передача в клиенте такая: public void loadFile(ActionEvent actionEvent) {...

Передача файлов через сокеты
Есть сервер import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; ...

Опять сокеты и передача строк
Здравствуйте! Помогите разобраться в плане передачи текста с помощью сокетов. Соорудил простейшие сервер и клиент и кидаю строку от...

3
36 / 36 / 10
Регистрация: 04.02.2010
Сообщений: 82
16.02.2010, 19:25
Первое, что приходит в голову: твоя информация z в конструктор в итоге передаётся не по значению, а по ссылке и поэтому, все три потока фактически одновременно работают с одним и тем же объектом.
А это значит, что первый поток его блокирует на время своего выполнения и этот объект становится не доступным для двух других.
То есть тебе нужно эти три потока синхронизировать.

Возможно, должно помочь что-то в таком роде:
Java
1
2
3
4
5
6
7
8
synchronized (z) {
  sender1 sd1=new sender1(z);
  sender2 sd2=new sender2(z);
  sender3 sd3=new sender3(z);
  sd1.start();
  sd2.start();
  sd3.start();
}
ps: все три класса (sender1, 2, 3) абсолютно одинаковые, их можно объединить в один. Просто при создании нового объекта передавать ему параметры сервера к которому подключаться.

Удачи
0
0 / 0 / 0
Регистрация: 30.01.2010
Сообщений: 10
17.02.2010, 20:37  [ТС]
одинаковые классы я планирую объединить, но думал, пусть пока хоть так получится, бо данные они передают не свосем одинаковые.

так как вы пишете не помогло пробовал ещё по-другому - помещаю m,n,b,c в z (это монитор), в него же добавляю функции:
Java
1
2
public synchronized double[][] copy_c()
    {return c;}
и далее по аналогии. потом в каждом сендере делаю копирование:
Java
1
2
3
double[][]c1=z.copy_c();
out1.writeObject(c1);
out1.flush();
вместо
Java
1
2
out1.writeObject(z.c);
out1.flush();
и так везде. но после этого передача корректно стала осуществляться то на 1, то на 2 сервера (раньше было на 1). а так всё равно не работает
0
0 / 0 / 0
Регистрация: 30.01.2010
Сообщений: 10
06.03.2010, 22:38  [ТС]
методом перебора разных вариантов получилось так:
Java
1
2
3
4
5
6
7
8
9
 ObjectInputStream in1 = new ObjectInputStream(s01[1].getInputStream());
            out1.writeInt(n);
            out1.flush();
            synchronized(z) {
               out1.writeObject(b1);
               out1.flush();
            }
            out1.writeObject(c);
            out1.flush();
при чём неважно, какой массив передаю первым, главное, что он в синхронайзе. далее можно передавать пофиг что и пофиг сколько - работает. не совсем понимаю, почему так, но работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.03.2010, 22:38
Помогаю со студенческими работами здесь

Несколько ip адресов
Всем привет! У меня такая проблема: мне нужен доступ от своего компьютера через 10-20 разных статических ip адреса. Есть вариант с арендой...

Сокеты - Несколько подключений
Помогите рахобраться в том как работает. accept() с несколькими людьми неужели для обработки пяти людей надо создавать пять переменых с...

Несколько адресов на одном ip
вопрос, возможно, не в ту ветку форума, но вотпрос такой. Можно ли на одном ip разместить несколько сайтов. Допустим у нас есть ip...

1С УТ 11.2. Несколько адресов доставки у ИП
Подскажите пожалуйста, есть ли возможность в 1С:УТАП 11.2 у одного контрагента (ИП) указать несколько адресов доставки, чтобы в документах...

Сокеты: передача файлов. С
Не могли бы вы показать какие-нибудь исходники на эту тему... я в ней новичок и вообще ни в зуб ногой) пробовал на шарпе, но знакомые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru