这是一个课的大作业,我想用 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,而且阿里云带宽很小,我也预料到延迟会比较大,但想先实现整个的工作流程
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.