接收HOST / PORT的输入,否则连接默认的HOST / PORT

时间:2013-12-05 21:38:42

标签: python

我正在尝试查询()请求主机名和端口,尝试并且如果不成功则尝试连接到默认主机/端口(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()

以下是我根本不输入任何内容时得到的结果:

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

如果我输入一个有效的主机/端口(有一个服务器在这个地址等待):

Host: 192.168.1.103
Port: 21567

Invalid Entry.

Host: 

我试图这样做,如果没有输入任何值,它会转到外部的其他地方以连接到默认的HOST / PORT,否则如果输入的值有效则连接到hostc / portc。

感谢您的时间。

3 个答案:

答案 0 :(得分:1)

我同意Sphere的说法,你的问题的代码片段并不完全是pythonic,并且肯定有更好的方法来完成你想要完成的任务。但是,话虽如此,只需要使用您的代码片段 - 我已经修改它以便建立套接字连接。让我知道它是怎么回事:

#!/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 :(得分:0)

您的代码中有一些不是非常“pythonic”的东西,但对于您的问题,我会做类似的事情: hostc = raw_input('Host: ') or HOST

答案 2 :(得分:0)

这是我自己的问题的更好答案,希望更多的'pythony',谢谢你的球体和ssheth建议它可以做得更好:

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