Python套接字编程,其他程序未连接到服务器

时间:2020-05-17 02:50:15

标签: python python-3.x networking localhost python-sockets

我多次打开同一程序(准确地说是10次),而我都在尝试首先解决随机数。当他们解决了这个数字后,他们打开了一个服务器,所有其他相同程序正在等待连接的单独线程上监听;当他们最终连接时,我希望它们全部关闭。

import random
import os
import socket
import threading
import time

host = '192.168.1.139'
port = 8011

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

def verified():
    print('Connection made successfuly')
    time.sleep(10)
    quit()

def network():
    try:
        s.connect(('192.168.1.135',8014))
        f = s.recv(50)
        finished = f.decode('utf-8')
        if finished == 'completed':
            quit()

    except:
        pass

def winner():
    x = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    x.bind(('192.168.1.135', 8014))
    x.listen(10)
    con, address = x.accept()
    con.send(bytes('completed', 'utf-8'))

def mine():
    global guess
    time.sleep(.000001)
    guess = random.randint(0,1000)
    print(guess)
    tran = 500



while True: 
    mine()
    if guess == 500:
        print("Solved")
        winner()
        break;
    else:
        x = threading.Thread(target=network)
        x.start()

由于某种原因,它正在连接到服务器,但没有退出程序,这可能是因为它正在连接到自身并快速退出吗?请帮忙,谢谢!

1 个答案:

答案 0 :(得分:1)

实际上,我很困惑,但是很显然,当quit()处于函数中时,它无法结束整个过程,因此,我建议您使用网络中的变量进行while循环将能够进行更改(甚至使用guess):

guessing = True
while guessing:
    mine()
    if guess == 500:
        print("Solved")
        winner()
        break;
    else:
        x = threading.Thread(target=network)
        x.start()

并将网络更改为:

def network():
    try:
        s.connect(('192.168.1.135',8014))
        f = s.recv(50)
        finished = f.decode('utf-8')
        if finished == 'completed':
            #quit()
            global guessing
            guessing = False

    except:
        pass

我发现没有使用两个常量hostport


不幸的是,赢家功能只是接受一个答案 (她有点内向) 但是我们可以解决这个问题:

def winner():
    x = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    x.bind(('192.168.1.135', 8014))
    x.listen(10)
    connected = 0
    while connected < 10:
        con, address = x.accept()
        con.send(bytes('completed', 'utf-8'))
        connected += 1

是的,她正在交朋友


好的,但是现在她在外面的世界中,需要与很多人交谈 不仅限于10人,所以她去了公共汽车站(她正在回家),她稍等片刻,看看是否有人会和她说话(出于某种原因),一段时间没有人说什么,所以,她放了她airpods并开始收听一些不错的声音{在此插入计算机功能喜欢听的音乐} 因此,要实现此目标:

def winner():
    x = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    x.settimeout(5) #  WAITS FOR FIVE SECONDS
    x.bind(('192.168.1.135', 8014))
    x.listen()
    while True:
        try:
            con, address = x.accept()
            con.send(bytes('completed', 'utf-8'))
        except socket.timeout: # IF IN FIVE SECONDS, RECEIVES NO CONNECTION
            break

x.settimeout(5)将使连接给出socket.timeout错误,如果超出设置的时间(在情况5中)而另一端没有任何响应。
现在我记得使用线程可以将客户端推送到另一个功能并“释放”客户端队列,但是我认为对于这种特殊情况,此解决方案更好