2013-05-02 3 views
2

Я думал об этом весь день, я действительно не думаю, что если Название правильное, но вот оно, позвольте мне объяснить мою ситуацию: Я работаю над проектом, сервером, созданным на Java для клиентов, созданных в Delphi , Conections хороши, несколько клиентов со своими потоками, работа с i/o работает хорошо. Клиенты отправляют строки на сервер, который я читаю с помощью BufferedReader. В зависимости от зарезервированных слов, которые получает сервер, он делает действие. Прежде чем клиент отправит строку, он вставляет информацию в базу данных SQL Server, чтобы сервер мог пойти и проверить ее после получения заказа/команды через сокет. Сервер получает информацию в базе данных, обрабатывает ее и отправляет ее ... назовем ее «Темная сторона».Как получить объект сокета без ссылочной переменной?

В тот момент, когда транзакция завершена, и информация отправляется на темную сторону, сервер вставляет информацию ... кашель, темную информацию в таблицу базы данных, чтобы клиент мог пойти и взять то, что он запросил , НО, мне нужно сообщить об этом клиенту! («Эй, еще раз проверьте базу данных, что вам нужно: 3»).

Коннектор, гнездо изготовлено в другом классе. Не тот, который я хочу использовать для ответа клиенту, поэтому, если у меня нет сокета, у меня нет OutputStream, о котором мне нужно поговорить. Этот класс, который обрабатывает и отправляет информацию в темную сторону, будет работать со сто транзакций в группе.

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

new Client(socket).start(); 

объектов без ссылок переменных, но, у меня есть возможность, я могу принять: Храните сокеты и их IP-адреса в объекте HashMap в тот момент, что новое соединение сделано, как это:

sockets.put(newSocket.getInetAddress().getHostAddress(), newSocket); 

Тогда я могу получить сокет (так что я могу получить OutputStream и ответ), призывающую статический метод, как это:

public static Socket getSocket(String IP) { 

     Socket RequestedSocket; 
     RequestedSocket = sockets.get(IP); 

     return RequestedSocket; 
    } 

Но я хочу, чтобы вы сказать мне, если есть это лучший способ сделать это, лучше, чем хранить все эти сокеты в списке/hashmap. Как я могу получить эти объекты без ссылочных переменных? Или, может быть, это хороший способ сделать это, и я просто пытаюсь преодолеть пределы.

P.S .: Я попытался сохранить объекты клиента в базе данных, сериализуя их, но сокеты не могут быть сериализованы.

Спасибо.

+0

, что удерживает вас от сохранения ссылки в классе 'под клиентом? – A4L

+0

В классе клиента есть ссылка (new Client()), но у меня нет всех ссылок для классов Client. Спасибо, что ответили – user2245180

+1

. Я предлагаю вам отслеживать ваши клиенты каким-то образом, а не сокеты, а затем добавлять метод к классу «Клиент» для уведомления клиентов, например «Уведомление клиента № (« данные доступны ») ' – A4L

ответ

0

Это проблема дизайна для вас. Вам нужно будет отслеживать их где-то, одним из решений может быть просто создание одноэлементного класса [SocketMapManager], например, который содержит hashmap, так что вы можете получить доступ к нему статически из других классов. http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html

+0

, что вы думаю, что произойдет с этими соединениями сокетов, если они будут открыты в течение неопределенного времени? Как вы думаете, синглтон - это место для хранения связей или объединения? у вас есть опыт в этом (сокеты и открытые потоки)? – tgkprog

0

Любое решение, которое говорит вам сохранить ссылку на сокет/соединение/поток, плохое ->, поскольку это означает, что ваши соединения будут задержаны, пока сервер выполнит свою работу.

У вас есть пара опций open 1. У клиентов есть серверы. когда они соединяются, они дают серверу свой IP, порт и некоторую секретную строку как часть дрожания руки. Это означает, что вы контролируете клиентский код, чтобы это произошло.

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

  2. клиентов подключаются к базе данных или другому приложению (веб-службе или обычным сокетам, таким как оригинальное приложение), которое подключается к базе данных, чтобы получить статус задания. Значение сервера дает клиенту идентификатор задания.

розетка открыта, тогда открыт один ресурс ОС. может читать вверх Network Programming: to maintain sockets or not?

Все зависит от того, сколько клиентов подключается за один раз/через 5 минут. 2. сколько секунд/минут требуется одному клиенту для обработки

, если количество клиентов в течение 5 минут является максимальным (в течение следующих 3 лет) 300 за раз/в любой 5-минутной продолжительности и каждый запрос занимает максимум 50 секунд для обработки, тогда достаточно выделенного сервера с максимальным количеством 50 000 сокетов. Кроме того, вам нужны асинхронные или более серверы (и переадресация DNS/веб-серверов/портов или другой метод для баланса нагрузки)

+0

Спасибо, что ответили. Мне понравился этот способ сделать это, это было бы очень хорошо, клиент, идущий по нему, чеканка, если транзакция будет выполнена, сохранение идентификатора или IP. Но я забыл сказать, что у меня нет контроля над кодом клиента. – user2245180

+0

Почему сохранение ссылки задерживает соединение? Пожалуйста, объясни. – EJP

+0

отредактирован ответ. не уверен, почему голос? – tgkprog

0

У меня возникла проблема с попыткой понять, что такое поток операций и что точно у вас есть в распоряжении. Правильно ли эта последовательность?
1. клиент записывает в базу данных (Дельфи)
2. клиент записывает на сервер (Дельфи)
3. сервер записывает в базу данных (Java)
4. Сервер записывает клиента (Java)
5. Клиент считывает база данных (delphi)
И проблема в том, что пропуск 4?

Более важно: вы говорите, что в классе Client нет сокета, и что у вас нет также списка Client?
Можете ли вы использовать отражение для поиска/получения ссылки на сокет от Client?
Если вы скажете , у вас нет сокета, как вы можете добавить этот сокет в HashMap?
И последнее, но не менее важное: зачем вам хранить гнездо? Может быть, каждый клиент открывает одно соединение, которое используется для нескольких запросов?

Это может быть красивым, если все ответы могут быть переданы только один IP: порт ...

+0

Последовательность правильная. Я сказал: «У меня нет сокета», но я имею в виду в классе, который будет использоваться для ответа. Поскольку я устанавливаю каждый поток без идентификатора, сокеты недоступны, по крайней мере я создаю HashMap или их список. Я могу получить IP-адрес и порт клиентов, но насколько я знаю: IP-адрес и порт клиентского сокета недостаточно для отправки/получения данных из него на Java, я бы хотел, чтобы я ошибся. – user2245180

+0

Но если вы инициализируете 'Client' с помощью' socket', вы не могли бы использовать, например, связанный список структуры с 'socket' и' Client'? Таким образом, у вас будет и то и другое. Вы даже можете упорядочить его с помощью 'hashCode()' сокета, так что это быстрее ... Если вам нужно ответить вручную с помощью сокета клиенту, что класс 'Client' делает с ним? – lunadir

Смежные вопросы