【问题标题】:python - stop waiting for input() when a condition (not timer) is metpython - 满足条件(不是计时器)时停止等待输入()
【发布时间】:2017-12-16 16:52:59
【问题描述】:

我是一个编程新手,非常喜欢用 python 编程。我目前正在开发一个程序,该程序使用 python 设置套接字以在两台主机之间建立 tcp 连接。

我的目标是创建一个可以为传入连接提供服务并启动连接建立的程序。换句话说,一旦程序启动,它将通过服务器的常规套接字设置并开始侦听传入连接。当程序监听传入连接时,它还会为用户提供通过在控制台中输入 IP 地址来启动连接的选项。

目标是……如果用户从不输入 IP 地址,程序将继续侦听传入连接。 如果建立了传入连接,程序将退出用户输入并通知用户建立了传入连接,然后禁止通过控制台输入建立传出连接的选项。(我知道两者都可以用线程处理,但我希望程序只处理一个连接,无论是作为服务器还是客户端)。

但是,如果用户键入 IP 地址,程序将尝试建立与输入 IP 的连接。如果建立了连接,它将停止侦听传入连接并专注于传出连接。

我在上面强调了我的问题。我需要一种在满足条件时(当建立传入连接时)退出 input() 提示的方法。目前,当建立连接时,我打印“传入连接已建立!”但是,在打印完之后,终端仍然等待用户输入...

import socket
import sys
from _thread import *

ipForInitiating = ''

host = ''
port = 5555

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

try:
    s.bind((host, port))
except socket.error as e:
    print(str(e))

s.listen(2)

def checkForIncoming():
    while ipForInitiating == '':
        conn, addr = s.accept()
        print('################################\nIncoming Connection 
               Established!\n Address = '+addr[0]+':'+str(addr[1]))
        break #Once connection is established break checkForOutgoing() and 
              #CheckForIncoming().  However, continue handleing incoming 
              #connection...

def checkForOutgoing():
    while True:
        if ipForInitiating != '':
            try:
                s.connect((ipForInitiating,port))
            except socket.error as e:
                print(str(e))

            break #Once connection is established break checkForIncoming() 
                  #and CheckForOutgoin.  However, continue handleing 
                  #outgoing connection...

print("Waiting for a connection...")

start_new_thread(checkForIncoming,())
start_new_thread(checkForOutgoing,())

ipForInitiating = input("...Or enter an ip address to initiate the 
connection.\n")

print(ipForInitiating)

【问题讨论】:

  • 这是一个非常好的描述。到目前为止,您尝试了哪些方法,在哪里遇到了问题?
  • 请将代码的相关部分发布为Minimal, Complete, and Verifiable example。人们只有在看到你的程序结构后才能给你相关的建议。
  • 正如我所提到的,我是一个新手程序员。发布我的代码我有点紧张,因为我确信我效率低下。我发现通过深入研究一个问题,然后通过出现的问题学习我的方式,我学得最好。这意味着我有时会使用我不完全理解的模块。其中之一是线程。我线程化了一个不断检查传入连接的函数。
  • 我会附上相关代码...
  • 网站上的人不会评判您或代码。他们只会指出代码不正确的地方。因此,下次您编写代码时,您将意识到以前的缺陷,并且不会重复它们。 P.S.:代码仍然丢失(不要“附加”它,只需将其作为 sn-p 添加到您的问题中)。

标签: python multithreading sockets


【解决方案1】:

在一个健全的操作系统上,它也允许在select.select 调用中使用非套接字描述符,我们可以检查从中返回的可读描述符,以决定是接受传入连接还是建立传出连接。

import select
import socket
import sys

host = ''
port = 5555

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(0)

print("Waiting for a connection...")
print("...Or enter an IP address to initiate the connection.")

if s in select.select([s, sys.stdin], [], [])[0]:   # only interest in readable
    conn, addr = s.accept()
    print('################################\nIncoming Connection Established!\n'
          'Address = '+addr[0]+':'+str(addr[1]))
else:
    ipForInitiating = input()
    conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    conn.connect((ipForInitiating, port))
    print(ipForInitiating)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2019-01-29
    • 2013-11-22
    相关资源
    最近更新 更多