Squeak.ru - шаблоны программирования

Связь между двумя компьютерами с использованием сокета python

Я использую эти две программы для связи между двумя моими компьютерами, один из которых подключен по ssh, и я ничего не возвращаю ни с одной из сторон. Он просто работает, ничего не отправляя

клиент

import sys
from socket import socket, AF_INET, SOCK_DGRAM

SERVER_IP   = '127.0.0.1'
PORT_NUMBER = 5000
SIZE = 1024
print ("Test client sending packets to IP {0}, via port {1}\n".format(SERVER_IP, PORT_NUMBER))

mySocket = socket( AF_INET, SOCK_DGRAM )

while True:
        mySocket.sendto('cool',(SERVER_IP,PORT_NUMBER))
sys.exit()

сервер

from socket import socket, gethostbyname, AF_INET, SOCK_DGRAM
import sys
PORT_NUMBER = 5000
SIZE = 1024

hostName = gethostbyname( '0.0.0.0' )

mySocket = socket( AF_INET, SOCK_DGRAM )
mySocket.bind( (hostName, PORT_NUMBER) )

print ("Test server listening on port {0}\n".format(PORT_NUMBER))

while True:
        (data,addr) = mySocket.recvfrom(SIZE)
        print data
sys.ext()

Что я могу делать неправильно?


Ответы:


1

Проблема в адресе вашего клиента:

SERVER_IP   = '127.0.0.1'

Вы подключаетесь к локальной машине и отправляете данные, а ваш сервер сидит на другом ip. Вам нужно подключиться либо к IP-адресу сервера, либо к имени хоста.

Вы можете проверить это, заставив клиента сначала подключиться (и потерпеть неудачу, если он не может)

...

import time

mySocket = socket( AF_INET, SOCK_DGRAM )
mySocket.connect((SERVER_IP,PORT_NUMBER))

while True:
        mySocket.send('cool')
        time.sleep(.5)

Обновление из комментариев

Поскольку вы подключены к Wi-Fi, это означает, что обе эти машины находятся в локальной сети. Вам нужно найти IP-адрес сервера в локальной сети, чтобы указать его в качестве цели.

Подход командной строки к поиску вашего IP

  • ОС X/Linux: ifconfig
  • Окна: ipconfig /all
05.07.2012
  • Я использовал адрес whatismyip.com, и он дает тот же результат. 06.07.2012
  • @ user1340048: Это ваш общедоступный IP-адрес. Если вы не настроили свой маршрутизатор для пересылки трафика через порт на ваш сервер, это не принесет вам много пользы. Используйте ips локальной сети. Эти две машины находятся в двух разных местах в сети? 06.07.2012
  • нет, они находятся на одном и том же беспроводном соединении. Где найти правильный локальный ip? Я пытался использовать SERVER_IP = '' 06.07.2012
  • Тогда вы хотите использовать IP-адреса локальной сети. Это зависит от вашей ОС. Посмотрите на конфигурацию вашей сети, чтобы найти свой IP. Обычно в панели управления или инструменте командной строки 06.07.2012
  • @user1340048: user1340048: Кроме того, установка SERVER_IP= — это то же самое, что и localhost. Поскольку они работают на двух разных машинах, вам необходимо указать целевой IP-адрес. В osx/linux команда может быть: ifconfig en0. В Windows это может быть ipconfig /all 06.07.2012

  • 2

    Эта программа используется для отправки строки строчных букв от клиента и получения заглавных букв от сервера.

    Сторона сервера

    import socket
    
    def Main():
       
        host = '192.168.0.12' #Server ip
        port = 4000
    
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.bind((host, port))
    
        print("Server Started")
        while True:
            data, addr = s.recvfrom(1024)
            data = data.decode('utf-8')
            print("Message from: " + str(addr))
            print("From connected user: " + data)
            data = data.upper()
            print("Sending: " + data)
            s.sendto(data.encode('utf-8'), addr)
        c.close()
    
    if __name__=='__main__':
        Main()
    

    Сторона клиента

    import socket
    
    def Main():
    
        host='192.168.0.13' #client ip
        port = 4005
        
        server = ('192.168.0.12', 4000)
        
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.bind((host,port))
        
        message = input("-> ")
        while message !='q':
            s.sendto(message.encode('utf-8'), server)
            data, addr = s.recvfrom(1024)
            data = data.decode('utf-8')
            print("Received from server: " + data)
            message = input("-> ")
        s.close()
    
    if __name__=='__main__':
        Main()
    
    23.08.2019

    3

    Если это не работает даже после изменения SERVER_IP на реальный адрес сервера, проверьте, принимает ли брандмауэр на вашем сервере трафик для UDP на порт 5000.

    если ваш сервер работает под управлением Linux, iptables -L покажет вам правила брандмауэра. iptables -F удалит все (!) правила брандмауэра, так что вы можете проверить, поможет ли это. это не постоянная перезагрузка.

    05.07.2012
  • К сожалению, он все еще не работает, и брандмауэр говорит, что разрешает все. 06.07.2012

  • 4

    Вы должны увидеть IP-адрес локальной сети, подобный этому: 192.168.1.102, который является обычным локальным адресом WiFi-маршрутизатора по умолчанию. Например, вы увидите следующее в командной строке Windows с помощью ipconfig:

    C:\Users\jackc>ipconfig
    
    Windows IP Configuration
    
    Wireless LAN adapter Wireless Network Connection 3:
    
       Media State . . . . . . . . . . . : Media disconnected
       Connection-specific DNS Suffix  . :
    
    Wireless LAN adapter Wireless Network Connection:
    
       Connection-specific DNS Suffix  . :
       Link-local IPv6 Address . . . . . : fe80::ed97:91a4:9449:204b%13
       IPv4 Address. . . . . . . . . . . : 192.168.8.106
       Subnet Mask . . . . . . . . . . . : 255.255.255.0
       Default Gateway . . . . . . . . . : 192.168.8.1
    

    Я попробовал следующий тестовый код, который работает для меня.

    Клиент:

    #!/usr/bin/env python3
    
    import sys
    from socket import socket, AF_INET, SOCK_DGRAM
    
    SERVER_IP   = '192.168.8.102'
    PORT_NUMBER = 5000
    SIZE = 1024
    print ("Test client sending packets to IP {0}, via port {1}\n".format(SERVER_IP, PORT_NUMBER))
    
    mySocket = socket( AF_INET, SOCK_DGRAM )
    myMessage = "Hello!"
    myMessage1 = ""
    i = 0
    while i < 10:
        mySocket.sendto(myMessage.encode('utf-8'),(SERVER_IP,PORT_NUMBER))
        i = i + 1
    
    mySocket.sendto(myMessage1.encode('utf-8'),(SERVER_IP,PORT_NUMBER))
    
    sys.exit()
    

    Сервер:

    #!/usr/bin/env python3
    
    from socket import socket, gethostbyname, AF_INET, SOCK_DGRAM
    import sys
    PORT_NUMBER = 5000
    SIZE = 1024
    
    hostName = gethostbyname( '0.0.0.0' )
    
    mySocket = socket( AF_INET, SOCK_DGRAM )
    mySocket.bind( (hostName, PORT_NUMBER) )
    
    print ("Test server listening on port {0}\n".format(PORT_NUMBER))
    
    while True:
        (data,addr) = mySocket.recvfrom(SIZE)
        print data
    sys.exit()
    
    08.12.2016

    5

    Чтобы подключиться к произвольному клиенту, вы должны привязать сокет либо к socket.gethostname(), что я успешно использую, либо использовать пустую строку ""

    Что касается кода сервера: мы использовали socket.gethostname(), чтобы сокет был виден внешнему миру. Если бы мы использовали

    s.bind(('localhost', 80)) 
    

    or

    s.bind(('127.0.0.1', 80)) 
    

    у нас по-прежнему будет «серверный» сокет, но он будет виден только внутри той же машины. s.bind(('', 80)) указывает, что сокет доступен по любому адресу, который есть у машины.

    источник

    09.05.2019
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...