如何制作语音聊天程序源码,制作语音社交交友APP
制作语音聊天程序源码不是一件容易的事情,或许一些前辈的做法能够给我们一些启示,以下代码为转载,来自云豹科技程序员——知乎作者111,原文链接如上,感谢授权
首先是客户端代码,这些代码主要实现内容有:
- 当用户进入退出直播间时,其他人会收到通知
- 聊天室内消息互通
- 管理员功能
具体代码如下:
# client.py
from socket import *
import os
import sys
用户发送消息
def send_msg(s, name, addr):while True:text = input('发言:')# 如果输入quit表示退出if text.strip() == 'quit':msg = 'Q ' + names.sendto(msg.encode(), addr)sys.exit('退出聊天室')msg = 'C %s %s' % (name, text)s.sendto(msg.encode(), addr)
接收消息
def recv_msg(s):while True:data, addr = s.recvfrom(2048)if data.decode() == 'EXIT':sys.exit(0)print(data.decode() + '\n发言:', end = " ")
创建套接字,登录,创建子进程
def main():# 从命令行获取服务端地址if len(sys.argv) < 3:print('argv is error')returnHOST = sys.argv[1]PORT = int(sys.argv[2])ADDR = (HOST, PORT)
# 创建套接字
s = socket(AF_INET, SOCK_DGRAM)while True:name = input('请输入姓名:')msg = 'L ' + name# 发送登录请求s.sendto(msg.encode(), ADDR)# 等待服务器回复data, addr = s.recvfrom(1024)if data.decode() == 'OK':print('您已进入聊天室')breakelse:# 不成功服务端会回复不允许登录原因print(data.decode())# 创建父子进程
pid = os.fork()
if pid < 0:sys.exit('创建子进程失败')
elif pid == 0:send_msg(s, name, ADDR)
else:recv_msg(s)
if __name__ == '__main__':main()其次是服务端代码#!/usr/bin/env python3
#coding = utf-8'''
name = lisimeng
email : 18844630644@163.com
data = 2018-9
instroduce: chatroom server
env : python3.5
'''
from socket import *
import os
import sysdef do_login(s, user, name, addr):if (name in user) or name == '管理员':s.sendto('该用户已存在'.encode(), addr)return# retrun到 do_parent()中的do_login(s, user, msgList[1], addr)s.sendto(b'OK', addr)
通知其他人
msg = '\n欢迎进入%s 聊天室' % name
for i in user:s.sendto(msg.encode(), user[i])# 插入用户
user[name] = addr
服务端转发聊天消息
def do_chat(s, user, name, text):msg = '\n%s 说: %s' % (name, text)for i in user:if i != name:s.sendto(msg.encode(), user[i])
退出聊天室
def do_quit(s, user, name):msg = '\n' + name + '退出聊天室'for i in user:if i == name:s.sendto(b'EXIT', user[i])else:s.sendto(msg.encode(), user[i])# 从字典中删除用户del user[name]
接收客户端请求
def do_parent(s):# 存储结构{'zhangsan':('0.0.0.0',9999)}user = {}while True:msg, addr = s.recvfrom(1024)msgList = msg.decode().split(' ')
# 区分请求类型if msgList[0] == 'L':do_login(s, user, msgList[1], addr)elif msgList[0] == 'C':do_chat(s, user, msgList[1], ' '.join(msgList[2:]))elif msgList[0] == 'Q':do_quit(s, user, msgList[1])
做管理员喊话
def do_child(s, addr):while True:msg = input('管理员消息:')msg = 'C 管理员' + msgs.sendto(msg.encode(), addr)
创建网络,创建进程,调用功能函数
def main():
# server address
ADDR = (‘0.0.0.0’, 8888)
# 创建套接字s = socket(AF_INET, SOCK_DGRAM)s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)s.bind(ADDR)# 创建一个单独的进程处理管理员的喊话功能pid = os.fork()if pid < 0:sys.exit('创建进程失败')elif pid == 0:do_child(s, ADDR)else:do_parent(s)
if __name__ == "__main__":main()
到这里,客户端代码便编写完毕,接下来准备编写服务端代码:
#!/usr/bin/env python3
#coding = utf-8'''
name = lisimeng
email : 18844630644@163.com
data = 2018-9
instroduce: chatroom server
env : python3.5
'''
from socket import *
import os
import sysdef do_login(s, user, name, addr):if (name in user) or name == '管理员':s.sendto('该用户已存在'.encode(), addr)return# retrun到 do_parent()中的do_login(s, user, msgList[1], addr)s.sendto(b'OK', addr)# 通知其他人msg = '\n欢迎进入%s 聊天室' % namefor i in user:s.sendto(msg.encode(), user[i])# 插入用户user[name] = addr
服务端转发聊天消息
def do_chat(s, user, name, text):msg = '\n%s 说: %s' % (name, text)for i in user:if i != name:s.sendto(msg.encode(), user[i])
退出聊天室
`def do_quit(s, user, name):msg = '\n' + name + '退出聊天室'for i in user:if i == name:s.sendto(b'EXIT', user[i])else:s.sendto(msg.encode(), user[i])# 从字典中删除用户del user[name]`
接收客户端请求
def do_parent(s):# 存储结构{'zhangsan':('0.0.0.0',9999)}user = {}while True:msg, addr = s.recvfrom(1024)msgList = msg.decode().split(' ')# 区分请求类型if msgList[0] == 'L':do_login(s, user, msgList[1], addr)elif msgList[0] == 'C':do_chat(s, user, msgList[1], ' '.join(msgList[2:]))elif msgList[0] == 'Q':do_quit(s, user, msgList[1])# 做管理员喊话def do_child(s, addr):while True:msg = input('管理员消息:')msg = 'C 管理员' + msgs.sendto(msg.encode(), addr)
创建网络,创建进程,调用功能函数
def main():
# server address
ADDR = ('0.0.0.0', 8888)# 创建套接字
s = socket(AF_INET, SOCK_DGRAM)
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s.bind(ADDR)# 创建一个单独的进程处理管理员的喊话功能
pid = os.fork()
if pid < 0:sys.exit('创建进程失败')
elif pid == 0:do_child(s, ADDR)
else:do_parent(s)
if __name__ == "__main__":main()接下来,是关于语音聊天程序源码搭建相关事宜
安装好swoole后开始搭建
前端
<meta charset="UTF-8">
<title>聊天室</title></head><style>
#set_name{margin: auto;text-align: center;
}</style><body><h3 style="text-align: center">亮亮的聊天室</h3><div id="set_name">
姓名:<input name="name" id="name"><input type="button" onclick="set_name();" value="进入群聊"></div><div id="chat" style="width: 600px; border: red 1px solid;margin: auto;display: none"><div id="sayContent" style="height: 300px;border-bottom: silver 1px dashed;"></div><div style="height: 75px;margin-top: 10px"><textarea id="content" style="height: 50px;width: 480px;background-color: #00a0e9;float: left;"></textarea><button id="submit" style="float: right;height: 55px;width:50px;margin-right:45px;display: block;" onclick="send_msg();">发送</button></div></div><script>var name = ws = '' ;//执行websockfunction chat() {var wsserver = 'ws://47.94.11.195:443';//调用WebSocket对象建立连接//ws wss: // ip:port(字符串)ws = new WebSocket(wsserver);//获取聊天内容展示窗口var sayContent = document.getElementById('sayContent');//onopen监听连接打开ws.onopen = function (v) {var user = new Object();user.name = name;user.type = 1;//对用户设置姓名var json = JSON.stringify(user);ws.send(json);//发送数据}//onmessage监听服务器数据推送ws.onmessage = function (v) {var html = sayContent.innerHTML;sayContent.innerHTML = html + "<br>"+v.data;}//监听连接关闭ws.onclose = function (v) {var html = sayContent.innerHTML;sayContent.innerHTML = html + "<br>聊天室已关闭!";}}//设置用户名function set_name() {name = document.getElementById('name').value;if(name == ''){alert('请输入用户名!');return false;}document.getElementById('set_name').style.display='none';document.getElementById('chat').style.display='block';chat();}function send_msg() {var content = document.getElementById('content');if(content.value == ''){alert('请输入聊天内容!');return false;}var msg = new Object();msg.content = content.value;msg.type = 2;var str = JSON.stringify(msg);ws.send(str);}</script></body></html>
后台
$server = new swoole_websocket_server("0.0.0.0", 443);
$server->users = [];
$server->on('open', function (swoole_websocket_server $server, $request) {$server->users[$request->fd]['id'] = $request->fd;
});
$server->on('message', function (swoole_websocket_server $server, $frame) {$data = json_decode($frame->data,true);if($data['type'] == 1){$server->users[$frame->fd]['name']=$data['name'];$server->push($frame->fd,'欢迎您('.$data['name'].')进入聊天室!');}else{foreach($server->users as $v){$server->push($v['id'], $server->users[$frame->fd]['name'].'说:'.$data['content']);}}
});
$server->on('close', function ($ser, $fd) {file_put_contents('qq.txt',$server->users[$frame->fd],FILE_APPEND);unset($server->users[$frame->fd]);
});
$server->start();
<?php# 定义 clientFds 数组 保存所有 websocket 连接
$clientFds = [];
创建 websocket 服务
$server = new swoole_websocket_server("0.0.0.0", 8080);# 握手成功 触发回调函数
$server->on('open', function (swoole_websocket_server $server, $request) use (&$clientFds) {# echo "server: handshake success with fd{$request->fd}\n";# 将所有客户端连接标识,握手成功后保存到数组中$clientFds[] = $request->fd;
});# 收到消息 触发回调函数
$server->on('message', function (swoole_websocket_server $server, $frame) use (&$clientFds) {# echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";# $server->push($frame->fd, "this is server");# 当有用户发送信息,发送广播通知所有用户foreach ($clientFds as $fd) {$server->push($fd, $frame->data);}
});# 关闭连接 触发回调函数
$server->on('close', function ($ser, $fd) use (&$clientFds) {# echo "client {$fd} closed\n";# 关闭会话 销毁标识 fd# 根据 value 去数组中找对应的 key$res = array_search($fd, $clientFds, true);unset($clientFds[$res]);
});# 启动 websocket 服务
$server->start();
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>WebSocket 聊天室</title></head><body><div id="main" style="width:600px;height: 200px; overflow: auto;border: solid 2px black;"></div><textarea id="textarea"></textarea><br/><input type="button" value="发送数据" onclick="send()"><script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script type="text/javascript">var name =prompt("请输入您的昵称","匿名者"); //弹出 input 框// 打开一个 web socketvar ws = new WebSocket("ws://ip:8080");ws.onopen = function() {console.log("连接成功");};//收到消息 触发回调ws.onmessage = function (evt) {var data = evt.data;console.log("收到 socket 服务消息,内容:" + data);$('#main').append("<p>" + data + "</p>");};function send() {var data = document.getElementById('textarea').value;ws.send(name+ ":"+ data);}ws.onclose = function() {// 关闭 websocketconsole.log("连接已关闭...");};</script></body></html>
最后,关于语音聊天程序源码如何上架请参考我的上一篇文章:https://blog.csdn.net/weixin_45629732/article/details/103309906
如何制作语音聊天程序源码,制作语音社交交友APP相关推荐
- 想把语音聊天程序源码上架,这工作可怎么做?
<2019中国网络视听发展研究报告>显示,2019年,网络视频用户规模高达7.25亿,其中网络音频用户达3.01亿,且从2018年底开始,陌生人语音社交程序如一匹黑马般杀出,成为新的社交热 ...
- 什么是语音聊天软件源码,语音直播间礼物如何开发
语音聊天软件源码是指,能够通过其搭建"用户使用其可以进行语音聊天操作"的软件源码. 语音聊天软件源码的形式是很多样的,它可以以直播的形式出现,可以以多人语音房间的形式出现,也可以用 ...
- 首发全DIY强大微信朋友圈截图制作生成小程序源码下载点赞,评论等等
这是一款朋友圈截图制作的一款小程序源码 主要的特点是DIY,之前小编发布过朋友圈截图的小程序 不管之前那款小程序只能生成点赞数量,无法获取用户名等等 但是这一款就不一样了,这一款刚刚也说了特点是DIY ...
- DIY微信朋友圈截图制作生成小程序源码下载
这是一款朋友圈截图制作的一款小程序源码 主要的特点是DIY,之前小编发布过朋友圈截图的小程序 不管之前那款小程序只能生成点赞数量,无法获取用户名等等 但是这一款就不一样了,这一款刚刚也说了特点是DIY ...
- 实用工具证件照制作微信小程序源码
这是一款证件照制作的微信小程序,里面也支持直接微信公众号版本生成安装 支持多种尺寸制作 支持相册上传于直接相机拍摄 支持电子照存档等等 拥有小程序推荐功能,可以给其它的小程序实现引流 另外还支持换装美 ...
- 全新实用工具证件照制作微信小程序源码下载支持多种证件生成与制作
这是一款证件照制作的微信小程序,里面也支持直接微信公众号版本生成安装 支持多种尺寸制作 支持相册上传于直接相机拍摄 支持多种类型的证件制作如,职业证件,公务员证件,身份证等各种类型 支持电子照存档等等 ...
- 小程序源码:百变头像框制作微信小程序源码下载,免服务器和域名
这是一款头像框制作的微信小程序源码 支持多种模板制作! 如一些热门的,王者头像框,国旗头像框,职业头像框等等 这一款小程序是免服务器和免域名的 所以也就是说这是一款纯前端的一款微信小程序源码 无需设置 ...
- 线上拍卖商城小程序源码制作开发
随着互联网时代的到来,网络购物渠道日趋完善,同时也吸引了越来越多的消费群体:其中,针对传统拍卖模式开发在线拍卖应用系统,可以整合电子商务渠道的优势和用户对拍卖的认知.为不同需求的商品提供一站式高效服务 ...
- 小程序源码:2022虎年全新头像框制作微信小程序源码下载-多玩法安装简单
给大家带来一款以2022虎年为主的一款头像制作小程序源码 内包含了虎年虎娃框,2022元旦新年框,国庆几种分类 每一种分类都包含了多种模板制作 虎娃的小编个人感觉那个卡通也是挺可爱的! 另外整个小程序 ...
- 小程序源码:2022虎年背景全新UI头像框制作微信小程序源码下载-多玩法安装简单
内包含了虎年虎娃多种分类头像框模板,全是和2022虎年有关 每一种分类都包含了多种模板制作 虎娃的小编个人感觉那个卡通也是挺可爱的! 另外整个小程序的背景UI都是以虎年为背景,所以总体的感觉还是很不错 ...
最新文章
- 如何使div填充剩余的水平空间?
- 从实际案例聊聊Java应用的GC优化--转
- Qt 中Treewidget添加右键菜单
- [CQOI2015]选数(杜教筛)
- 【小项目】Axios 实现前后端交互
- ul li一行两个显示
- 基本算法——前缀和与差分
- Spring Data JPA 条件查询 分页查询
- 通过Vite2.0创建前端项目(Vue3、Vue2、React)
- 光纤交换机 和 SAN交换机 概念
- pikachu~~~验证码绕过(on client on server)
- RTL8188 Linux驱动移植
- 用 Python 基于均线交叉策略进行回测
- 淘宝新店流量如何从0到1000
- linux 串口读写 termios说明
- 【笔记】Polygon mesh processing 学习笔记(10)
- android 反向进度条,Android progressBar 正向绘制与反向绘制
- ip地址转换数字函数 iton_esp8266 inet_ntoa函数实现 ip地址转换为字符串 MAC地址转字符串...
- python代码转exe
- 通常我们将python语言程序保存在一个后缀_知到毛概章节测试答案2020
热门文章
- 图像分割算法的优缺点比较
- android 判断 飞行模式,Android 设置飞行模式,判断是否是飞行模式
- 算法设计与分析: 2-13 标准二维表问题
- Lexicon Enhanced Chinese Sequence Labelling Using BERT Adapter 论文解读
- 游戏设计之路——游戏设计文档详解(GDD)
- 关于资产分池ABS等金融衍生品内容来袭
- ELK日志分析系统理论加实操演练!!
- 电脑桌面显示不全设置方法
- android加速传感器应用,如何在android智能手机中使用加速计传感器查找位移距离?...
- 超键、候选键、主键区别?