Тема: Обмін даними через інтернет/локалку

Доброго дня. Можливо моє запитання здасться не зовсім корекним, а алгоритм повним маразмом - списуйте це на те, що я не професійний програміст, а вчитель хімії. Програмування це моє хоббі.
Ото ж, суть задачі:
слід забезпечити обмін даними між користувачами однії проги. Звісно ж, можна використати клієнт/серверний підхід, проте, для поставлених задач він, на мою думку, не потрібен, адже 99,99% робочого часу програма має працювати саме в оффлайн (навіщо робити повноціний сервер, розміщувати незроземіло де, щоб був цілодобовий доступ, і т. д.?).
Як це все має працювати:
- в неті розміщена лише БД, з якою звязується серверна частина програми(далі сервер).
- при запусці проги, id коситувача помічаються як он, при закриті як офф
- при запиті користувача, сервер перевіряє, чи необхідний користувач в онлайн.
- якщо так, забезпечує пряму передачу даних між двома компютерами через інтернет.

Все те ж повине працювати і на локалці.

Власне запитання: чи можливо це зробити? Якщо так, то з чого слід починати?

Вибачте, одну літеру "Д", віруси згризли... :)

2

Re: Обмін даними через інтернет/локалку

Коротке доповнення - програма пишеться на яві.

Вибачте, одну літеру "Д", віруси згризли... :)

3

Re: Обмін даними через інтернет/локалку

Билокодер написав:

Коротке доповнення - програма пишеться на яві.

А чому на мотоциклі? Крісла нема чи шо?

А якщо серйозно, наскільки Ви порозумілися із Java? Скоро прийде джавамен і врятує.

Мій блог про ОС сімейства *nix - http://nixtravelling.blogspot.com/

4

Re: Обмін даними через інтернет/локалку

1. Схоже на технічне завдання.
2. Ніколи не називайте Java - явою, бо джавісти (і всі інші) плачуть кривавими сльозьми.
3. Що означає Ваш нік?

Власне запитання: чи можливо це зробити? Якщо так, то з чого слід починати?

Можна, якщо сервер Ваш самописний, але Ви кажете що то не варіант. Або якщо сервер вже існує і має документацію, як до нього під'єднуватись і як з ним взаємодіяти. Або або, якщо Ви хочете написати децентралізовану систему (без сервера, або в якості сервера тільки сервер який буде відповідати за коннект юзерів) теж можна але то в рази складніше (якщо не в десятки разів). Ще буває підхід, коли серверні функції бере на себе один з клієнтів, але тоді все ж потрібний якийсь сервер щоб клієнти знали одне про одного. Я колись щось подібне писал, в якості такого сервера використовував маленьку бібліотеку, що під'єднувалась до ICQ сервера і клієнти спокійно обмінювались повідомленнями.

x

5 Востаннє редагувалося P.Y. (29.08.2016 11:55:09)

Re: Обмін даними через інтернет/локалку

- в неті розміщена лише БД, з якою звязується серверна частина програми(далі сервер).

- при запусці проги, id коситувача помічаються як он, при закриті як офф

Тобто, статус користувача (онлайн/офлайн) зберігається в БД на сервері?
Користувач при запуску з'єднується з сервером, пише «я онлайн» і від'єднується, при закритті — так само, але пише «я офлайн»? (Добре, уявімо, комп'ютер користувача (який онлайн) несподівано вимкнувся, й програма не встигла повідомити сервер про вихід з мережі. Як діяти в такій ситуації?)

Або ж користувач з'єднується з сервером, і це з'єднання триває до завершення роботи користувача (і сервер вважає, що користувач онлайн, доки це з'єднання не буде закрито. Що теж не дуже бажано: кількість відкритих з'єднань — обмежений ресурс; втім, для невеликої кількості користувачів не критично).

Або ж користувач кожні n хвилин пише серверу «я онлайн» — якщо не з'явився протягом останніх n хвилин, значить, вже не в мережі? (Але можлива ситуація, коли користувач щойно вийшов з мережі, й n хвилин ще не минуло).

(Гадаю, можливі й інші варіанти чи їх комбінація).

- при запиті користувача, сервер перевіряє, чи необхідний користувач в онлайн.

- якщо так, забезпечує пряму передачу даних між двома компютерами через інтернет.

Центральний сервер інформує клієнта (2), як зв'язатися з клієнтом (1), після чого його місія завершена?

В принципі, щось подібне існує вже (взяти, для прикладу, торенти, де центральний сервер (торент-трекер) лише допомагає клієнтам знайти один один одного, а сам файлів не пересилає), тому не бачу, чому це неможливо.

В найпростішому випадку, кожен користувач одночасно є клієнтом та сервером (мається на увазі не центральний сервер, який зв'язує клієнтів між собою, а те, що користувач очікує з'єднання від іншого комп'ютера для обміну даними) - у цьому випадку, центральний сервер зберігатиме імена користувачів та їх IP-адреси, IP користувача має лишатися статичним у межах мережі (локалки чи інету), також на машинах користувачів має бути відкритий певний наперед обумовлений порт для прийому зовнішніх з'єднань від інших користувачів. Гугліть java.net.Socket, java.net.ServerSocket, також, імовірно, в програмі буде задіяно багатопотоковість (java.lang.Thread).

py -3 -m pip install git+https://github.com/snoack/python-goto

6

Re: Обмін даними через інтернет/локалку

P.Y. написав:

Гугліть java.net.Socket, java.net.ServerSocket, також, імовірно, в програмі буде задіяно багатопотоковість (java.lang.Thread).

+ JDBC

Билокодер написав:

- якщо так, забезпечує пряму передачу даних між двома компютерами через інтернет.

А IP зовнішні та статичні?
Можливо краще спробуйте, щось на зразок Dropbox API: https://www.dropbox.com/developers-v1/core/start/java

Подякували: quez, leofun012

7 Востаннє редагувалося VTrim (29.08.2016 14:11:23)

Re: Обмін даними через інтернет/локалку

Регнути хост з будь-якою СУБД, наприклад MySQL та зробити API для швидкого доступу до БД з потрібними даними (запис/зчитування)/онлайн,оффлайн і т.д.
API тому, що далеко не кожен хостинг дає прямий  доступ до БД.

На PHP знаю як все це реалізувати.

Подякували: 0xDADA11C71

8 Востаннє редагувалося P.Y. (29.08.2016 15:14:48)

Re: Обмін даними через інтернет/локалку

API звучить надто наворочено для такої елементарної задачі. Усе, що нам треба від сервера — передати інформацію клієнтові, як зв'язатися з іншим клієнтом (якщо той онлайн), або отримати інформацію від клієнта про йоого онлайн/офлайн статус. Гадаю, городити тут http-інтерфейс для прийому клієнтських SQL-запитів буде зайвим (чи яке API малось на увазі?).

py -3 -m pip install git+https://github.com/snoack/python-goto

9 Востаннє редагувалося VTrim (29.08.2016 15:51:05)

Re: Обмін даними через інтернет/локалку

Ну, складних апі городити дійсно не треба..
Наприклад запити..
http://api.site.com/online/set/1
Записали в бд час онлайну користувача з id1

.../online/get/1

Поверне 0 або 1, користувач офлайн/онлайн відповідно.

Всі SQL запити на стороні API сервера.

10 Востаннє редагувалося voland (02.09.2016 11:12:49)

Re: Обмін даними через інтернет/локалку

Щось ви дуже просто розглядаете задачу. А якщо програма на має прямого доступу до інтернету? Тобто компьютер не має свого статичного IP в мережі? Тоді, навіть знаючи свій зовнішній IP, ви все одно не зможете ним скористуватись та з"єднатись з цим "клієнтом".
ІМХО, тут треба або курити хмарні API на Java, або кліпати спочатку "трансферний сервер на веб-ресурсі на PHP з авторизацією, який би міг пробросити дани між двома "абонентами", а потім вже імплементувати запроси на той сервер, щоб передавати дані між хостами на стороні вже тих самих хостів.

ЗІ: все це вже давно працює у TeamViewer'і. Хоча, можливо, вони використовують свій спеціальний хост для цього (і пишуть увесь трафік ;) ).

... якщо швидкість коннекту між абонентамі особоливо не має значення - зробіть краще обмін через саму БД - ви можете через веб-запроси класти спеціальні дані для хостів. Останні ж мають постійно запрошувати свої "комірки" (таблиці), щоб забрати свою "пошту" та відповісти. Я так давно-давно пробував робити розподілені обчислення.

Подякували: leofun011

11

Re: Обмін даними через інтернет/локалку

Щось у вас тут вже rocket science з пхп пішов :)

Те, що Ви хочете зробити, дуже схоже на механізм роботи Skype. При включенні, клієнт зв'язується з центральним сервером і публікує свої технічні дані (public IP), у свою чергу сервер публікує статус "онлайн". Коли два клієнта хочуть з'єднатися між собою (P2P) вони дізнаються про необхідні для підключення інформації у сервера і виконують підключення. У цьому випадку один з клієнтів усе одно виступає у ролі сервера, інший-клієнта.

Все це Ви можете реалізувати використовуючи сокети. Тут (https://docs.oracle.com/javase/tutorial … index.html) докладніше як можна реалізувати простіший сервер-клієнт застосунок.

Якщо виникнуть питання, звертайтеся. Бажано вже з якимись мінімальним кодом.

Подякували: leofun011

12

Re: Обмін даними через інтернет/локалку

...