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

Python Socket Programming, other programs aren't connecting to the server

我多次打开同一个程序(准确地说是 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()

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

其实我是一头雾水,但是显然当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) 如果超过了设置的时间(在情况 5 中)而另一方没有任何响应,x.settimeout(5) 将使连接给出一个 socket.timeout 错误。
现在我记得使用线程我们可以将客户端推送到另一个函数和 "free" 客户端队列,但我认为对于这种特殊情况,这个解决方案更好