#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, а настройки сети.
Комментариев нет:
Отправить комментарий