Python 套接字地址已在使用错误

Python Sockets Address already in use error

提问人:Emir Ünalan 提问时间:11/12/2023 更新时间:11/12/2023 访问量:32

问:

我将从 RPi 获取网络摄像头帧,并将其发送到我的 PC。然后,我将随机数从 PC 发送到 RPi。我需要用相同的代码来完成(我将对图像进行一些更改,并在我连接到RPI的屏幕上打印信息。但是当我尝试运行代码时,程序返回以下错误:

Traceback (most recent call last):
  File "/home/flood/Desktop/server.py", line 32, in <module>
    server_socket.bind(('0.0.0.0', 8000))
OSError: [Errno 98] Address already in use

Server.py :

import io
import cv2
import socket
import struct
import time
import numpy as np
from PIL import Image

ip = str(input('Enter IP address: '))
camera = cv2.VideoCapture(0)
while True:
    cl_socket = socket.socket()
    cl_socket.connect((ip, 8000))
    cl_connection = cl_socket.makefile('wb')
    stream = io.BytesIO()
    ret, frame = camera.read()
    frame = cv2.resize(frame, (640, 480))
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    frame = Image.fromarray(frame)
    frame.save(stream, format="JPEG")
    stream.seek(0)
    image_bytes = stream.read()
    cl_connection.write(struct.pack('<L', len(image_bytes))) 
    cl_connection.flush()
    stream.seek(0)
    cl_connection.write(stream.read())
    stream.seek(0)
    stream.truncate() 
    cl_connection.close()
    cl_socket.close()

    server_socket = socket.socket()
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_socket.bind(('0.0.0.0', 8001))
    server_socket.listen(0)
    server_connection = server_socket.accept()[0].makefile('rwb')
    
    while True:
        message = server_connection.readline()
        if message:
            print(message)
            break

Client.py :

import cv2
import io
import socket
import struct
from PIL import Image
import numpy as np
import random

while True:
    server_socket = socket.socket()
    server_socket.bind(('0.0.0.0', 8001))
    server_socket.listen(0)
    server_connection = server_socket.accept()[0].makefile('rb')
    
    image_len = struct.unpack('<L', server_connection.read(struct.calcsize('<L')))[0]
    if not image_len:
        break
    image_stream = io.BytesIO()
    image_stream.write(server_connection.read(image_len))
    image_stream.seek(0)
    image = Image.open(image_stream).convert('RGB')
    image = np.array(image)
    cv2.imshow('Image', cv2.cvtColor(image, cv2.COLOR_RGB2BGR))
    cv2.waitKey(1)

    server_connection.close()
    server_socket.close()

    new_socket = socket.socket()
    new_socket.connect(('192.168.1.109', 8000))
    new_connection = new_socket.makefile('rwb')
    r = random.randint(0, 100)
    new_connection.write(str(r).encode())
    new_connection.flush()

    new_connection.close()
    new_socket.close()
python-3.x 套接字 tcp socket.io

评论

1赞 Carcigenicate 11/12/2023
为什么要在客户端的同一端口上启动服务器?如果它们在同一台机器上运行,这就是问题所在。
1赞 Steffen Ullrich 11/12/2023
您显示的代码与错误不符。代码中没有端口 8000 上的绑定/侦听,只有端口 8001 上的绑定/侦听。我并不清楚你一开始想做什么。看起来您正在尝试通过让每一端既是客户端又是服务器来进行双向连接。但是,没有必要这样做,因为套接字实际上已经是双向的了。
0赞 Emir Ünalan 11/12/2023
@SteffenUllrich我知道套接字可以是双向的,但是当我尝试这样做时,程序再次出现错误。接收到从第一台计算机发送的消息,但未收到从第二台计算机发送的消息,并且程序中出现问题。
0赞 Steffen Ullrich 11/12/2023
@EmirÜnalan:“......但是当我尝试这样做时,程序再次出现错误。...“ - 使用具有双向通信的单个套接字的代码应该与您在问题中显示的代码有很大不同。不可能对此代码提供任何建议,因为其中太多是未知的。

答: 暂无答案