Próbuję mieć zapytanie () poprosić o hostname i port, spróbuj, a jeśli nieudany po prostu spróbuj połączyć się z domyślnym hostem / portem (LocalHost / 21567).

from socket import *
import re

HOST = 'localhost'  # server IP
PORT = 21567        # port
BUFSIZ = 1024
ADDR = (HOST, PORT)
ip = re.compile(r'([0-9\.]{1,3}){4}')

def query():
    while True:
    hostc = raw_input('Host: ')
    portc = int(input('Port: '))
    if (portc != None & bool(re.match(ip, hostc))):
        try:
            tcpCliSock.connect(hostc, portc)
            break
        except:
            pass
        print("\nInvalid Entry.\n")
    else:
        tcpCliSock.connect(ADDR)
        break

tcpCliSock = socket(AF_INET, SOCK_STREAM)   # allocate client's socket
query()

Oto, co mam, kiedy nic nie wprowadzam:

Traceback (most recent call last):
  File "./tcpclient.py", line 30, in <module>
    query()
  File "./tcpclient.py", line 17, in query
    portc = int(input('Port: '))
  File "<string>", line 0

    ^
SyntaxError: unexpected EOF while parsing

A jeśli wprowadzę ważny host / port (na tym adresie znajduje się serwer):

Host: 192.168.1.103
Port: 21567

Invalid Entry.

Host: 

Próbuję to zrobić, jeśli nie wprowadzono żadnych wartości, przechodzi do zewnętrznego innego, aby połączyć się z domyślnym hostem / portem, w przeciwnym razie, jeśli wprowadzone wartości są ważne, łączy się z HOSTC / PortC.

Dziękuję za Twój czas.

0
Gov 6 grudzień 2013, 01:38

3 odpowiedzi

Najlepsza odpowiedź

Zgadzam się z kula, którą fragment kodu Twoje pytanie nie jest dokładnie pytalnikiem i jest zdecydowanie lepszy sposób na zrobienie tego, co chcesz osiągnąć. Jednak, powiedział, że po prostu biorąc swój fragment kodu - zmodyfikowałem go do pracy, jeśli chodzi o ustalenie połączenia z gniazdem. Daj mi znać jak idzie:

#!/usr/bin/python

from socket import *
#import re

HOST = 'localhost'  # server IP
PORT = 21567        # port
BUFSIZ = 1024
ADDR = (HOST, PORT)
#ip = re.compile(r'([0-9\.]{1,3}){4}')


def validate_ip(ip):
    try:
        if inet_aton(ip):
           return True
    except:
        return False

def query():
    while True:
        hostc = raw_input('Host: ')
        portc = raw_input('Port: ')
        if (portc and validate_ip(hostc)):
            try:
                tcpCliSock.connect(hostc, int(portc))
                break
            except:
                pass
            #print("\nInvalid Entry.\n")
        else:
            tcpCliSock.connect(ADDR)
            break

tcpCliSock = socket(AF_INET, SOCK_STREAM)   # allocate client's socket
query()
1
cog_n1t1v3 5 grudzień 2013, 22:22

Są nie bardzo "Pythonic" rzeczy w twoim kodzie, ale w odniesieniu do twojego pytania zrobię coś w rodzaju: hostc = raw_input('Host: ') or HOST

0
sphere 5 grudzień 2013, 21:42

Oto lepsza odpowiedź na moje własne pytanie, miejmy nadzieję, że więcej "pytony", dziękuję za sfera i ssheth do sugerowania, że można to zrobić lepiej:

parser = argparse.ArgumentParser()
parser.add_argument("--host", type=str, default='localhost',
                    help="Host other than %(default)s.")
parser.add_argument("--port", type=int, default=21567, 
                    help="Port other than %(default)s.")
args = parser.parse_args()

HOST = args.host
PORT = args.port
0
Gov 6 grudzień 2013, 19:26