#java #клиент_сервер
нашел вариант реализации клиент-серверного взаимодействия посредством UDP на java. Сервер: import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class Server { public static void main(String args[]) { try { //Создаем сокет DatagramSocket sock = new DatagramSocket(7000); //буфер для получения входящих данных byte[] buffer = new byte[65536]; DatagramPacket incoming = new DatagramPacket(buffer, buffer.length); System.out.println("Ожидаем данные..."); while(true) { //Получаем данные sock.receive(incoming); byte[] data = incoming.getData(); String s = new String(data, 0, incoming.getLength()); System.out.println("Сервер получил: " + s); //Отправляем данные клиенту DatagramPacket dp = new DatagramPacket(s.getBytes() , s.getBytes().length , incoming.getAddress() , incoming.getPort()); sock.send(dp); } } catch(IOException e) { System.err.println("IOException " + e); } } } Клиент: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class Example2 { public static void main(String args[]) { DatagramSocket sock = null; BufferedReader cin = new BufferedReader(new InputStreamReader(System.in)); try { sock = new DatagramSocket(); while(true) { //Ожидаем ввод сообщения серверу System.out.println("Введите сообщение серверу: "); String s = (String)cin.readLine(); byte[] b = s.getBytes(); //Отправляем сообщение DatagramPacket dp = new DatagramPacket(b , b.length , InetAddress.getByName("localhost") , 7000); sock.send(dp); //буфер для получения входящих данных byte[] buffer = new byte[65536]; DatagramPacket reply = new DatagramPacket(buffer, buffer.length); //Получаем данные sock.receive(reply); byte[] data = reply.getData(); s = new String(data, 0, reply.getLength()); System.out.println("Сервер: " + reply.getAddress().getHostAddress() + ", порт: " + reply.getPort() + ", получил: " + s); } }catch(IOException e) { System.err.println("IOException " + e); } } } Проблема в том,что здесь взаимодействие идет через localhost и работает в рамках одного устройства...я уже несколько дней потратил на то,чтобы понять что туда передать вместо localhost,чтобы можно было запустить сервер на одном устройстве,А клиент на абсолютно другом,подключенному к другой сети,пробовал и local ip пихать и ip, который выдавали различные сайты...все не работает...подскажите пожалуйста UPD:покопавшись,я наткнулся на такую вещь как NAT и то,что я не подключаюсь напрямую к интернету,так что собственно как можно это обойти?
Ответы
Ответ 1
решил данный вопрос и решил поделиться,мало ли кого-то на что-то натолкнет... как сказал @Victor мой ip из вне был недоступен,так роутер предоставлял единый внешний ip для всех подключенных устройств,а мой ip был внутренним,не буду особо расписывать данный момент,т.к. могу что-то сказать не правильно(просто загуглите NAT). решил проблему подключением к интернету не через роутер,а напрямую воткнув кабель в ноутбук,таким образом я напрямую(!) подключился к интернету и ip моего ноутбука стал доступен из вне,что и позволило подключиться к моему серверу человеку из другого города=) свой ip можно узнать вбив ipconfig в командную строку(для Windows, для Unix не знаю) или проверив его на одном из множества сайтов. Если они совпадают,значит вы напрямую подключены к интернету и можно смело указывать данный ip вместо localhost. Если что-то написано не правильно-дополните в комментариях.Ответ 2
Ну, собственно, подключение будет идти по вашему ip (локальному, или внешнему), никакой магии в этом нет. Просто вместо localhost подставляете ip-адрес вашего сервера(например 192.168.1.30) и радуетесь жизни. другое дело, если у вас нет внешнего ip-адреса, например у вас локальная сеть предприятия. В таком случае достучаться до вашего ip из вне будет весьма проблемно, и есть повод задуматься об отдельном сервере для этого дела. В коде проблем никаких нет. При общении в пределах локальной сети проблем быть так же не должно. Если же вам нужно настроить ваш роутер\сервер для доступа из вне, то увы, это не java, а настройки сети.
Комментариев нет:
Отправить комментарий