获取主机/端口的输入,否则使用默认主机/端口连接

2024-04-19 22:09:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试让query()询问主机名和端口,如果不成功,请尝试连接到默认主机/端口(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: 

我试图使之成为这样,如果没有输入值,它将转到外部else以连接到默认主机/端口,否则如果输入的值有效,它将连接到hostc/portc。你知道吗

谢谢你抽出时间。你知道吗


Tags: 端口importrelocalhosthostinputportline
3条回答

我同意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()

在你的代码中有一些不太“pythonic”的东西,但是关于你的问题,我会做如下的事情: hostc = raw_input('Host: ') or HOST

下面是我自己问题的更好答案,希望更多的“Python”,感谢sphere和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

相关问题 更多 >