如何用djang更正zmq地址使用错误

2024-04-25 14:22:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Django创建一个简单的视频流网站。我使用cv2启动网络摄像头和ZMQ从客户端到服务器传输数据。我发现了这个link,我用它编写了代码的联网部分。在

代码本身运行良好,但是当我创建一个简单的HTML文件来通过浏览器启动实时流时,代码失败并显示以下错误消息

zmq.error.ZMQError: Address in use

我想这个错误是因为Django使用的IP和ZMQ尝试使用的IP是相同的。但我不知道如何纠正这个错误。在

这是我目前为止的代码

在服务器.py

^{2}$

在视图.py

from server import *

def index(request):

    face_cascade_path = '../../../TRAINED MODELS/FACE/haarcascade_frontalface_default.xml'
    footage_socket = start_server()
    recv_content(footage_socket, face_cascade_path)

    return render(request, 'index.html')

def start_client(request):
    context = zmq.Context()
    footage_socket = context.socket(zmq.PUB)
    footage_socket.connect('tcp://192.168.1.18:5020')

    print('connected to server')
    print('starting video on client machine')

    camera = cv2.VideoCapture(0)  # init the camera

    while True:
        try:
            grabbed, frame = camera.read()  # grab the current frame
            frame = cv2.resize(frame, (640, 480))  # resize the frame
            frame = cv2.flip(frame, 1)
            encoded, buffer = cv2.imencode('.jpg', frame)
            jpg_as_text = base64.b64encode(buffer)
            footage_socket.send(jpg_as_text)

        except KeyboardInterrupt:
            camera.release()
            cv2.destroyAllWindows()
            break

在索引.html

<html>
<head>

</head>
<body>
  <div class='container'>
    <h2>CAMERA SERVER CLIENT TEST</h2>

    <p>
    Click the start_client button to start camera. Each frame of the stream is sent to the server.
    </p>
    <p>
      The camera code is running on the client side.
    </p>

    <a href ='start_client/'><button>start client</button></a>

  </div>
</body>
</html>

请帮帮我。在

提前谢谢你

编辑1-我已编辑添加客户端部分的代码和索引.html也。start_client函数位于视图.py. 此函数在中的“启动客户端”按钮时运行索引.html点击

编辑2-我已经编辑了问题,添加了我的问题截图。当我在添加try except块后刷新页面时,我不会遇到“address in use”错误,但网页仍然没有加载。

enter image description here


Tags: the代码client编辑客户端serverhtml错误
1条回答
网友
1楼 · 发布于 2024-04-25 14:22:24

您应该采用另一个端口,而不是通常使用的8000端口。在

另一个想法是任何套接字选项都必须放在ZMQ中的bind或{}方法之前。在

所以你的代码应该是这样的:

def start_server():
    context = zmq.Context()
    footage_socket = context.socket(zmq.SUB)
    footage_socket.setsockopt_string(zmq.SUBSCRIBE, np.unicode(''))

    try:
        footage_socket.bind('tcp://192.168.1.18:5020')  # Another port used.
    except:
        pass

    return footage_socket

[注意]:

不要忘记将客户端的端口(.connect())更改为5020。在


[更新]:

相关问题 更多 >