нашел вариант реализации клиент-серверного взаимодействия посредством 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. Если что-то написано не правильно-дополните в комментариях.
Комментариев нет:
Отправить комментарий