Страницы

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

четверг, 23 января 2020 г.

создание удаленного сервера и подключение к нему через сокеты на java

#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, а настройки сети.

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

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