Страницы

Поиск по вопросам

пятница, 15 марта 2019 г.

создание удаленного сервера и подключение к нему через сокеты на 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 и то,что я не подключаюсь напрямую к интернету,так что собственно как можно это обойти?


Ответ

решил данный вопрос и решил поделиться,мало ли кого-то на что-то натолкнет... как сказал @Victor мой ip из вне был недоступен,так роутер предоставлял единый внешний ip для всех подключенных устройств,а мой ip был внутренним,не буду особо расписывать данный момент,т.к. могу что-то сказать не правильно(просто загуглите NAT). решил проблему подключением к интернету не через роутер,а напрямую воткнув кабель в ноутбук,таким образом я напрямую(!) подключился к интернету и ip моего ноутбука стал доступен из вне,что и позволило подключиться к моему серверу человеку из другого города=) свой ip можно узнать вбив ipconfig в командную строку(для Windows, для Unix не знаю) или проверив его на одном из множества сайтов. Если они совпадают,значит вы напрямую подключены к интернету и можно смело указывать данный ip вместо localhost. Если что-то написано не правильно-дополните в комментариях.

Комментариев нет:

Отправить комментарий