Python 学生党如何进行软件开发请教

这是一个课的大作业,我想用 Python 写一个实现语音通话功能的软件,基本原理就是每个客户端录音(可能会加些处理)然后传到阿里云服务器再转发给其他用户播放。现在在最后阶段遇到了一些问题,来向 V2 大佬们请教。

下面是服务器端的部分代码

def trans1(client):#接受音频文件
    return recv.recv(client)

def trans2(k,client,t):#转发音频文件 for j in t: if j.get_result()==0:#如果没接收到文件,程序退出 global closesignal closesignal = 1 sys.exit(-1)

    if j!=t[k]:
        while 1:
            if not j.isAlive():#接受进程结束后转发
                break
        recv.send(client,j.get_result())

def trans3(): t1=[]#对每个客户端接受的线程列表 t2=[]#对每个客户端发送的线程列表 while 1:#返回检测符合条件的客户端 list total=check() print(total) if len(total): break

# for i in total:
i=total[0]#测试第一组
amount=len(i[0])#组内客户端数量
print(amount)
clients=recv.server_connect(amount)#建立 socket
while 1:
    for j in range(amount):#接受客户端 j 的文件
        if closesignal==1:
            sys.exit(-1)
        th=MyThread(func=trans1,args=[clients[j][0]])#创建接受子线程

        if len(t1)<j+1:#如果是第一次转发
            t1.append(th)
        else:#如果不是第一次转发
            t1[j]=th
        t1[j].start()

    for k in range(amount):#将客户端 k 的文件转发给其他客户端
        if closesignal == 1:
            sys.exit(-1)
        th2=threading.Thread(target=trans2,args=(k,clients[k][0],t1))#创建转发子线程

        if len(t2)<k+1:#同上
            t2.append(th2)
        else:
            t2[k]=th2
        t2[k].start()
        t2[k].join()

客户端主要代码

    def flow(self,s):
        while 1:
            record.record(self.username)
            send.send(s, self.username)
            for i in self.userlist:
                if self.username != i:
                    send.recv(s)#这行能跑完,跑完就 crash
                    t = threading.Thread(target=play.play,args=[i])#播放文件,问题应该出在这一行,跑不到这一行
                    t.start()
            if self.closesignal==1:
                s.close()
                break

我只成功过一次,这个循环跑不起来,只能传第一次的文件,就会报 Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

ps:非 CS 专业工科学生,代码不规范,各位多包涵

pps:用的是 socket 的 TCP 传的,速度不如 UDP,而且阿里云带宽很小,我也预料到延迟会比较大,但想先实现整个的工作流程


Python 学生党如何进行软件开发请教

4 回复

SIGSEGV 是内存方面的问题啊
你这个 target=play.play 函数是哪儿来的?是不是这个组件有问题?


我理解你作为学生想开始软件开发,但你的问题太宽泛了。Python开发有很多方向:Web开发(Django/Flask)、数据分析(pandas)、机器学习(scikit-learn)、自动化脚本等。

你得先明确想做什么。如果是Web开发,可以从Flask开始,它比Django轻量。先装好Python和pip,然后:

# 安装Flask
pip install flask

# 基础示例 app.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello World!'

if __name__ == '__main__':
    app.run(debug=True)

跑起来后访问 http://localhost:5000 就能看到效果。关键是多动手写代码,从简单项目开始,比如做个待办事项应用或博客系统。

找项目练手比只看教程有效。

那个是播放文件的函数,用的 pyaudio
def play(username):
CHUNK = 1024
if os.path.isfile(username+’.wav’):
wf = wave.open(username+’.wav’, ‘rb’)
p = pyaudio.PyAudio()

stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)

data = wf.readframes(CHUNK)

while data != b’’:
stream.write(data)
data = wf.readframes(CHUNK)

stream.stop_stream()
stream.close()

p.terminate()
else:
print(‘no file to play’)

不太看得懂你的程序
你的函数里经常饮用一些“不知道从哪儿来的”变量

回到顶部