【问题标题】:error 9 Bad file descriptor error using sockets in python错误 9 在 python 中使用套接字时出现错误的文件描述符错误
【发布时间】:2016-09-17 15:26:29
【问题描述】:

我正在尝试使用非阻塞套接字在 python 中实现一个非常基本的客户端服务器代码。我做了两个线程用于阅读和写作。

我的客户端代码如下。

import sys
import socket
from time import sleep
from _thread import *
import threading

global s

def writeThread():
    while True:
        data = str(input('Please input the data you want to send to client 2 ( to end connection type end ) : '))
        data = bytes(data, 'utf8')
        print('You are trying to send : ', data)
        s.sendall(data)

def readThread():
    while True:
        try:
            msg = s.recv(4096)
        except socket.timeout as e:
            sleep(1)
            print('recv timed out, retry later')
            continue
        except socket.error as e:
           # Something else happened, handle error, exit, etc.
            print(e)
            sys.exit(1)
        else:
            if len(msg) == 0:
                print('orderly shutdown on server end')
                sys.exit(0)
            else:
                # got a message do something :)
                print('Message is : ', msg)


if __name__ == '__main__':

    global s
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('',6188))
    s.settimeout(2)

    wThread = threading.Thread(None,writeThread)
    rThread = threading.Thread(None,readThread)

    wThread.start()
    rThread.start()

    s.close()

问题:

我知道这也可以通过 select 模块来实现,但我想知道如何做到这一点。

【问题讨论】:

  • 如果您提供准确的错误输出会有所帮助。
  • connect调用成功了吗?

标签: sockets python-3.x server


【解决方案1】:

您的主线程创建套接字,然后创建线程 1 和线程 2。然后它关闭套接字(并退出,因为程序在那之后结束)。这样当 thread1 和 thread2 尝试使用它时,它就不再打开了。因此EBADF(错误的文件描述符错误)。

您的主线程不应在其他线程仍在运行时关闭套接字。它可以等待它们结束:

[...]
s.settimeout(2)
wThread = threading.Thread(None,writeThread)
rThread = threading.Thread(None,readThread)
wThread.start()
rThread.start()
wThread.join()
rThread.join()
s.close()

然而,由于主线程没有什么比等待更好的事情要做,最好只创建一个额外的线程(比如rThread),然后让主线程接管当前正在由另一个线程执行的任务。即

[...]
s.settimeout(2)
rThread = threading.Thread(None,readThread)
rThread.start()
writeThread()

【讨论】:

    猜你喜欢
    • 2020-01-21
    • 1970-01-01
    • 2019-01-28
    • 2021-12-20
    • 2013-04-04
    • 2016-02-15
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    相关资源
    最近更新 更多