使用Python让客户端套接字等待服务器套接字

4
我会尽力帮助您翻译以下内容,涉及到IT技术。如果我理解错了,请您指正。

我试图让客户端保持活动状态并等待服务器的连接。目前,如果我在服务器之前打开客户端,它将失败,因为客户端找不到服务器连接并停止运行。我看到过类似的主题,但它们是针对C#和Java的。由于我是新手,请大家帮忙 :)

客户端代码:

#!/usr/bin/env python
import pyaudio
import socket
import sys
import time


# Pyaudio Initialization
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 10240

p = pyaudio.PyAudio()

stream = p.open(format = FORMAT,
                channels = CHANNELS,
                rate = RATE,
                input = True,
                frames_per_buffer = chunk)

# Socket Initialization
host = ''
port = 50000
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))

# Main Functionality
while 1:
    data = stream.read(chunk)
    s.send(data)
    s.recv(size)

服务器代码:

#!/usr/bin/env python
import pyaudio
import socket, ssl
import sys

# Pyaudio Initialization
chunk = 1024
p = pyaudio.PyAudio()

stream = p.open(format = pyaudio.paInt16,
                channels = 1,
                rate = 10240,
                output = True)

# Socket Initialization
host = ''
port = 50000
backlog = 5
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port))
s.listen(backlog)

client, address = s.accept()

# Main Functionality
while 1:
    data = client.recv(size)
    if data:
        # Write data to pyaudio stream
        stream.write(data)  # Stream the recieved audio data
        client.send('ACK')  # Send an ACK

client.close()
stream.close()
p.terminate()

还有一个问题,如果要使用远程连接而不是本地连接运行相同的程序,我应该使用什么类型的协议-python扩展?非常感谢:)

1个回答

9
您可以尝试类似以下的操作:
#!/usr/bin/env python
import pyaudio
import socket
import sys
import time


# Pyaudio Initialization
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 10240

p = pyaudio.PyAudio()

stream = p.open(format = FORMAT,
                channels = CHANNELS,
                rate = RATE,
                input = True,
                frames_per_buffer = chunk)

# Socket Initialization
host = ''
port = 50000
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connected = False
while not connected:
    try:
        s.connect((host,port))
        connected = True
    except Exception as e:
        pass #Do nothing, just try again

# Main Functionality
while 1:
    data = stream.read(chunk)
    s.send(data)
    s.recv(size)

关于你的第二个问题:这应该也适用于远程连接,因为你使用 host='' 来绑定所有接口。只需要确保你的路由器端口转发设置正确(只有服务器需要进行端口转发)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接