python - 当满足条件(非计时器)时停止等待input()

时间:2017-12-16 16:53:00

标签: python multithreading sockets

我是一个非常喜欢用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)

1 个答案:

答案 0 :(得分:0)

在健全的操作系统上,该操作系统还允许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)