Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

Python socket как передавать информацию между двумя устройствами

можно ли сделать программу на python с библиотекой socket, что бы можно было передавать на расстояние информацию между двумя компьютерами, если да, то нужно ли тратить деньги на создание айпи или что то в этом духе, просто когда я пытался сделать сервер клиент с другого устройства просто не мог подключится. я знаю что можно использовать такую программу как radmin VPN, хотел бы найти способ без внешних программ.

По дате
По рейтингу
Аватар пользователя
Оракул
5мес

Сервер

12345678910111213141516171819
 import socket 
 
HOST = ''  # Пустая строка означает, что сервер слушает на всех доступных интерфейсах 
PORT = 5000  # Выбранный порт 
 
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: 
    s.bind((HOST, PORT)) 
    s.listen() 
    print(f"Сервер запущен. Ожидание подключения на порту {PORT}") 
    conn, addr = s.accept() 
    with conn: 
        print(f"Подключился {addr}") 
        while True: 
            data = conn.recv(1024) 
            if not data: 
                break 
            print(f"Получено: {data.decode()}") 
            conn.sendall(data)  # Эхо: отправляем обратно те же данные 
 


Клиент

123456789101112
 import socket 
 
HOST = 'IP_сервера'  # Замените на IP-адрес сервера 
PORT = 5000  # Тот же порт, что и у сервера 
 
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: 
    s.connect((HOST, PORT)) 
    s.sendall(b'Привет, сервер!') 
    data = s.recv(1024) 
 
print('Получено от сервера:', data.decode()) 
 


Всё довольно просто — на сервере запускаете слушающий сокет на нужном порту, а на клиенте подключаетесь по IP-адресу сервера, не забывая при этом проверить, что брандмауэр или антивирус не блокирует соединение; если же устройства находятся в разных сетях через Интернет, то нужно настроить на роутере переадресацию (port forwarding), чтобы внешний запрос шел к вашему серверу, а если IP динамический, то можно воспользоваться сервисом динамического DNS для связывания IP с доменным именем, и при этом вовсе не требуется тратить деньги на получение специального IP — большинство интернет-провайдеров уже предоставляют публичный IP, просто в настройках роутера и сети следует правильно учитывать работу NAT и firewall.

Аватар пользователя
Мудрец
5мес

Да, вы можете создать программу на Python с использованием библиотеки `socket` для передачи данных между компьютерами через интернет **без платных услуг** и внешних программ. Вот как это сделать:

---

### 1. Основные принципы:
- **Сервер** слушает на определенном IP-адресе и порту.
- **Клиент** подключается к IP-адресу и порту сервера.
- Для связи через интернет вам понадобится **внешний IP-адрес** сервера (обычно предоставляется провайдером).

---

### 2. Пример кода:

#### Сервер (на принимающем компьютере):
```python
import socket

# Настройки сервера
HOST = '0.0.0.0' # Слушать все интерфейсы
PORT = 12345

with socket.socket( socket.AF _INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
conn, addr = s.accept()
with conn:
print('Connected by', addr)
data = conn.recv(1024)
print("Received:", data.decode())
conn.sendall(b"Message received!")
```

#### Клиент (на отправляющем компьютере):
```python
import socket

# Настройки подключения
HOST = 'IP_СЕРВЕРА' # Заменить на внешний IP сервера
PORT = 12345

with socket.socket( socket.AF _INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b"Hello from client!")
data = s.recv(1024)
print("Received:", data.decode())
```

---

### 3. Настройка для работы через интернет:
1. **Узнайте внешний IP сервера**:
- Перейдите на сайт [ ipinfo.io ](ipinfo.io) на серверном компьютере.
- Используйте полученный IP в клиенте.

2. **Проброс портов (Port Forwarding)**:
- Зайдите в настройки роутера серверного компьютера.
- Перенаправьте порт (например, `12345`) на локальный IP серверного компьютера в локальной сети.
- Инструкции для разных роутеров: [ portforward.com ]( https://portforward.com/ ).

3. **Проверьте брандмауэр**:
- Разрешите входящие соединения на выбранном порту.

---

### 4. Если нет внешнего IP:
- **Динамический DNS (бесплатные варианты)**:
Используйте сервисы вроде [No-IP]( https://www.noip.com/ ) или [DuckDNS]( https://www.duckdns.org/ ), чтобы получить доменное имя для динамического IP.

---

### 5. Локальная сеть:
Если компьютеры в одной локальной сети:
- Используйте локальный IP сервера (например, `192.168.x.x`).
- Отключите фаерволы на время теста.

---

### 6. Почему может не работать:
- **Неправильный IP/порт** в клиенте.
- **Брандмауэр/роутер** блокирует соединение.
- Провайдер блокирует порты (часто для портов ниже 1024).

---

### 7. Безопасность:
- Не оставляйте порты открытыми постоянно.
- Добавьте аутентификацию или шифрование (например, с помощью `ssl`).

---

### Пример через интернет:
1. Сервер запущен на компьютере с внешним IP `95.123.45.67`.
2. В клиенте указать:
```python
HOST = '95.123.45.67'
PORT = 12345
```
3. Роутер перенаправляет порт `12345` на серверный ПК.

Теперь клиент может подключиться из любой точки мира! 🌍

Аватар пользователя
Мудрец
5мес

Тебе нужен статический IP, посмотри условия у своего провайдера как его получить.