Клиент Python не подключится к серверу - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь исправить эту ошибку с прошлых 3 дней, и я постепенно устаю от нее, может кто-нибудь указать мне правильное направление, пожалуйста?

Итак, я написал 2 скрипта, один - сервер, а другой - клиент.

Server.py

#!/usr/python

import socket
import os

port = 3000

def clear():
    os.system('clear')
    print("-:-:-:-:-:Server:-:-:-:-:-")

#Starting Server
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
host = socket.gethostname()
serversocket.bind((host, port))
serversocket.listen(1)

clear()

clientsocket, addr = serversocket.accept()
print("Connection from: " + str(addr))
while True:
    msg = raw_input(" ->")

    if msg == "help":
        clear()
        print("+-----------------------------------+")
        print("|             Help Menu             |")
        print("+-----------------------------------+")      
        print("|   help       -   shows help menu  |")
        print("+-----------------------------------+")
        print("|   clear      -   clears           |")
        print("+-----------------------------------+")
        raw_input("Press ANY key to return")
        clear()
    elif msg == "clear":
        clear()
    else:
        msg = str(msg).encode("UTF-8")
        clientsocket.send(msg)
        msg = clientsocket.recv(4096)
        print(msg.decode("UTF-8"))

и

Client.py

#!/usr/python

import socket
import time

def send(msg):
    try:
        s.send(msg.encode("UTF-8"))
    except:
        Connect()

def getInstructions():
    try:
        while True:
            msg = s.recv(4096)
            inst = msg.decode("UTF-8")
            time.sleep(5)
            send("!")
    except:
        Connect()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()

def Connect():
    try:
        print("Connect() connecting to: "+ str(host) + str(3000)) 
        s.connect((host, 3000))
        getInstructions()
    except:
        time.sleep(1)
        print("Connect() Exception")
        Connect()
Connect()

Вкратце, то, что делают мои программы, это

Сервер запускается и ожидает входящего трафика

Клиент запускается и отправляет трафик на сервер

Клиент отправляет каждые 5 секунд строку (в данном случае "!"), Если сервер не получает его, клиент пытается повторно подключиться к серверу, и здесь возникает проблема, клиент не подключается повторно, он застрял внутри Цикл Connect (), поскольку он больше не может подключаться

Я пытался всегда создавать новый сокет при переподключении

Client.py

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()

    def Connect():
        try:
            print("Connect() connecting to: "+ str(host) + str(3000))
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((host, 3000))
            getInstructions()
        except:
            time.sleep(1)
            print("Connect() Exception")
            Connect()

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

И еще кое-что, что может быть полезно сказать: клиент подключается к серверу, а затем я останавливаю сервер, клиент переходит в «режим переподключения», а затем я снова запускаю сервер, ничего не происходит, клиент все еще пытается восстановить соединение (но не удается). Сейчас мне нужно перезапустить клиент, чтобы восстановить соединение, и это не совсем то, что я ищу ..

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Я наконец .. НАКОНЕЦ! нашел причину, почему это не сработало .. (Я не эксперт, поэтому, возможно, кто-то может изменить это там, чтобы быть более "точным")

Я создал соединение через сокет TCP, которое сохранило детали своего соединения, вероятно, целиком внутри переменной s

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

С деталями соединения я имею в виду его, вероятно, например, на сервере есть статические детали, которые не изменятся так сильно (192.168.2.100 на порту 3000), но клиент не использует этот конкретный порт для связи, клиент использует какой-то случайный порт, который доступно, и по какой-то причине это было причиной, почему клиент не работал (Но опять же, это только мой тезис, я не знаю его лучше ..)

Но вот что я изменил

Client.py

#Connection
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()

def Reconnect():  #Ive created a new function called Reconnect, because, .., well it works fine for now
    try:
        global s #Its accessing the global socket variable
        s = ""   #blanks it out (not sure if i have to blank it out)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # create again a new socket
        s.connect((host, port)) # It tries to connect again
        getInstructions() # done~
    except:
        time.sleep(1)
        print("Reconnecting")
        Reconnect()

def Connect():
    try:
        print("Connect() connecting to: "+ str(host) + str(port)) 
        s.connect((host, port))
        getInstructions()
    except:
        time.sleep(1)
        print("Connect() Exception, trying to Reconnect()")
        Reconnect()

Но вот почему я так люблю программировать, конечно, это 2-х нарезанный нож, но, черт возьми, вы чувствуете, что получаете после решения глупой ошибки с 10сек. стоит набрать

0 голосов
/ 18 января 2019

Сервер, необходимый для приема команд.

Server.py

import socket
import os

port = 3000

#Starting Server
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
host = socket.gethostname()
serversocket.bind((host, port))
serversocket.listen(1)

clientsocket, addr = serversocket.accept()
print("Connection from: " + str(addr))

clientsocket.send("-:-:-:-:-: Connected in theServer :-:-:-:-:-")

def menuHelp():
    clientsocket.send("\
+-----------------------------------+ \n \
|             Help Menu             | \n \
+-----------------------------------+ \n \
|   help       -   shows help menu  | \n \
+-----------------------------------+ \n \
|   clear      -   clears           | \n \
+-----------------------------------+")

while True:
    msg = clientsocket.recv(4096)
    msg = msg.decode("UTF-8")

    if msg == "help":
        menuHelp()
    elif msg == "clear":
        clientsocket.send("Command Clear\n")
    else:
        clientsocket.send("invalid option\n")
        menuHelp()

и клиент.

Client.py

import socket
import time

def send(msg):
    try:
        s.send(msg.encode("UTF-8"))
    except:
        Connect()

def getInstructions():
    try:
        msg = s.recv(4096)
        print(msg.decode("UTF-8"))
        input("Press ANY key to return")
    except:
        Connect()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()

def Connect():
    try:
        print("Connect() connecting to: "+ str(host) + str(3000)) 
        s.connect((host, 3000))
        send("help")

        while True:
            getInstructions()       
            cli = input(" ->")
            send(cli)
    except:
        time.sleep(1)
        print("Connect() Exception")
        Connect()
Connect()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...