【问题标题】:Python Socket Programming, other programs aren't connecting to the serverPython Socket编程,其他程序没有连接到服务器
【发布时间】:2020-09-02 21:07:54
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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) 如果超过了设置的时间(在情况 5 中)而对方没有任何响应,则将使连接产生 socket.timeout 错误。
    现在我记得使用线程我们可以将客户端推送到另一个函数并“释放”客户端的队列,但我认为对于这种特殊情况,这个解决方案更好

    【讨论】:

    • 我仍然遇到程序只是不听第一个完成的问题,我假设套接字应该能够一次处理 10 个请求,因为我设置了 s.listen( 10)。也许它没有,我错了。
    • Oooooohhh,但你的日子才刚刚开始好转,我要编辑我的答案来回答这个问题
    • 那太好了哈哈,这让我难过了几个小时!
    • 完成了,现在程序接受 9 个连接(因为解决它的那个是另一个丢失)
    • 是的,解决了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 2011-08-24
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    相关资源
    最近更新 更多