pythonsocket:客户机如何将多条消息发送到服务器

2024-04-26 05:48:42 发布

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

对编码非常陌生。我有两个Python脚本。一个是服务器,另一个是图形用户界面(GUI),它也充当客户机(因为我不知道如何连接它们,因为我需要将GUI生成的数据发送到服务器)。在while循环中,您可以看到我正在从所有三个连接接收消息。
用户1连接
用户2是conn1
GUI是conn2

但是从用户1和用户2各自发送一条消息(这是dBA在给定时刻通过麦克风)。但是对于GUI,它会发送三条消息(音频阈值、第一个麦克风索引、第二个麦克风索引),我需要在服务器端接收这些消息。但是服务器上显示的这种方式在我接收这些消息时似乎不起作用,但每次运行代码时都会以一种奇怪/不同的模式出现。

服务器端:

import socket
import requests
import os

PARAMS = {'Function': "Cut",
          "Duration": 300,          # First Camera
          "Input": 1}
PARAMS2 = {'Function': "Cut",
           "Duration": 300,         # Second Camera
           "Input": 2}
PARAMS3 = {'Function': "Cut",
           "Duration": 300,         # Overview Camera
           "Input": 3}


# VMix's API Endpoint - Requests are made to this API
URL_ENDPOINT = "http://127.0.0.1:8088/api/"

CLIENT1 = "Client 1"
CLIENT2 = "Client 2"
TH = "Threshold"
INDEX1 = "INDEX1"
INDEX2 = "INDEX2"


# Socket creation
s = socket.socket()  # Creates a socket
host = socket.gethostname()
port = 50200
print("Socket Created...")
s.bind((host, port))
print("Socket Bound...")
s.listen()
print("Waiting for connections...")
print(26 * '-')

# GUI client
conn2, addr2 = s.accept()
print(f"☑ GUI with IP: {addr2} has connected...")

# Setup the connection for the first client
conn, addr = s.accept()
print(f"☑ Client with address {addr} has connected...")


# Connection setup for the second client
conn1, addr1 = s.accept()
print(f"☑ Client with address {addr} has connected...")

print(26 * '-')

print("Recieving audio")

while True:
    print("{:15}{:15}{:15}{:15}{}".format(CLIENT1, CLIENT2, TH, INDEX1, INDEX2))
    while 1:
        recv_message, recv_message1, recv_message2 = conn.recv(128), conn1.recv(128), conn2.recv(1024)
        recv_index, recv_index1 = conn2.recv(1024), conn2.recv(1024)

        print("{:18}{:18}{:18}{:18}{}".format(recv_message.decode(
            "utf-8"), recv_message1.decode("utf-8"), recv_message2.decode("utf-8"),
            recv_index.decode("utf-8"), recv_index1.decode("utf-8")))

        threshold = recv_message2


        db, db1, threshold = int(recv_message), int(recv_message1), int(threshold)
        if (db > threshold) and (db > db1):
            response = requests.get(url=URL_ENDPOINT, params=PARAMS)
        elif (db1 > threshold) and (db1 > db):
            response = requests.get(url=URL_ENDPOINT, params=PARAMS2)
        else:
            response = requests.get(url=URL_ENDPOINT, params=PARAMS3)

GUI端:

import tkinter as tk
from tkinter import *
from tkinter import ttk
import subprocess
import requests
import socket
import struct
import os
import time
from threading import *
try:
    import pyaudio
except ImportError:
    os = struct.calcsize("P") * 8
    if(os == 32):
        url = 'https://kenan0x0.github.io/Project-PAD/week3/PyAudio-0.2.11-cp37-cp37m-win32.whl'
        local_filename = url.split('/')[-1]
        r = requests.get(url, allow_redirects=True)
        open(local_filename, 'wb').write(r.content)
        subprocess.call(["pip", "install", local_filename], shell=False)
        subprocess.call(
            ["python", "-m", "pip", "install", "pyaudio"], shell=False)
    else:
        url1 = 'https://kenan0x0.github.io/Project-PAD/week3/PyAudio-0.2.11-cp37-cp37m-win_amd64.whl'
        local_filename1 = url1.split('/')[-1]
        r1 = requests.get(url1, allow_redirects=True)
        open(local_filename1, 'wb').write(r1.content)
        subprocess.call(["pip", "install", local_filename1], shell=False)
        subprocess.call(
            ["python", "-m", "pip", "install", "pyaudio"], shell=False)


s = socket.socket()
host = socket.gethostname()
port = 50200
s.connect((host, port))

# Main window
window = tk.Tk()
window.geometry("650x600")
window.title("Black Magic Switcher")
window.iconbitmap(r'./Iconshock-Disc-Jockey-Mixer.ico')

# Threads so functions can be called simultaneously


def cliThread():

    Thread(target=runClient).start()


def klaThread():
    Thread(target=runClient2).start()


def devThread():
    Thread(target=showDevi).start()

# ------------------ End Threads ----------------------

# Functions that perform a task


def showTH():
    # while True:
    #     s.send(val.encode("utf-8"))
    #     time.sleep(0.2)
    #     window.update()
    while True:
        threshold = ThresholdEntry.get()
        threshold = str(threshold)
        s.send(threshold.encode("utf-8"))
        time.sleep(0.2)
        window.update()
# Runs Client 1


def runClient():
    os.system("python client.py")

# Runs Client 2


def runClient2():
    os.system("python klant.py")


# Prints entry values first mic


def showEntry():
    index = firstMicEntry.get()
    index = str(index)
    s.send(index.encode("utf-8"))

# Prints entry values second mic


def showEntry1():
    index = secondMicEntry.get()
    index = str(index)
    s.send(index.encode("utf-8"))

# Shows connected input devices


def showDevi():
    p = pyaudio.PyAudio()
    info = p.get_host_api_info_by_index(0)
    numdevices = info.get('deviceCount')
    for i in range(0, numdevices):
        if (p.get_device_info_by_host_api_device_index(0, i).get('maxInputChannels')) > 0:
            lbl = tk.Label(text=("Input Device id ", i, " - ",
                                 p.get_device_info_by_host_api_device_index(0, i).get('name')))
            lbl.pack()


def killServer():
    os.system("taskkill /f /im py.exe")

# ----------------------- End Functions -----------------------------


# Title of the program
h1 = tk.Label(text="User GUI | Black Magic", font=("Kreon", 25))
h1.pack()

bk1 = ttk.Separator(window, orient="horizontal")
bk1.pack(fill="x", pady=5)

# Threshold
h2 = tk.Label(text="Audio-Threshold: ⤵", font=("Kreon", 15))
h2.pack()


# scale = tk.Scale(window, from_=0, to=100, command=showTH,
#                  orient="horizontal", length=400, cursor="fleur")
# scale.set(44)
# scale.pack(pady=3)

ThresholdEntry = tk.Entry(width=20, justify="center", bd=3)
ThresholdEntry.pack(pady=3)
sendTH = tk.Button(text="Input Threshold", activebackground="black",
                   activeforeground="white", cursor="hand2", relief="raised", command=showTH)
sendTH.pack(pady=3)

# Devices listing Button
devbut = tk.Button(text="Show Available Mics", activebackground="black",
                   activeforeground="white", cursor="hand2", relief="raised",
                   command=devThread)
devbut.pack(pady=3)


# Label change first mic
firstMic = tk.Label(text="Insert First Mic Index ⤵: ")
firstMic.pack(pady=3)
firstMicEntry = tk.Entry(width=20, justify="center", bd=3)
firstMicEntry.pack(pady=3)
sendMicIndex = tk.Button(text="Send First Index", activebackground="black",
                         activeforeground="white", cursor="hand2", relief="raised", command=showEntry)
sendMicIndex.pack(pady=3)

# Client 1 Button
clibut = tk.Button(text="Run First Client", activebackground="black",
                   activeforeground="white", cursor="hand2", relief="raised", command=cliThread)
clibut.pack(pady=3)


# Label change second mic
secondMic = tk.Label(text="Insert Second Mic Index ⤵: ")
secondMic.pack(pady=3)
secondMicEntry = tk.Entry(width=20, justify="center", bd=3)
secondMicEntry.pack(pady=3)
sendMicIndex1 = tk.Button(text="Send Second Index", activebackground="black",
                          activeforeground="white", cursor="hand2", relief="raised", command=showEntry1)
sendMicIndex1.pack(pady=3)

# Client 2 Button
klabut = tk.Button(text="Run Second Client", activebackground="black",
                   activeforeground="white", cursor="hand2", relief="raised", command=klaThread)
klabut.pack(pady=3)

exitBut = tk.Button(text="Stop Program", activebackground="black",
                    activeforeground="white", cursor="hand2", relief="raised", command=killServer)
exitBut.pack(pady=3)

window.mainloop()

在所有这些代码之后,我的问题是。客户端是否可以使用多个socket.send()语句,服务器是否可以按正确的顺序接收相同数量的connection.recv()语句。
我知道这段代码中有很多东西需要改进,但是对于初学者来说,除了这些多次发送之外,它正在做我需要它做的事情。如果你对代码有其他注释,请分享。你知道吗


Tags: textimportclientgetindexdefbuttonsocket