基于C#局域网语音聊天
基于C#局域网语音聊天室,可实现文本消息的发送、接收及语音聊天,是一个很不错的,适合初学者的软件开发项目。(未经验证)
——http://wenku.baidu.com/link?url=f1gmOU2J04pf3wB9tldwuZS3VsXWYlmhUPSwdLvPXu_sBLhyjKwy2y3RMO6Rzh3esvl7-TnoEz5nUz_HVGkFlFAOwVwjgvOZG5nGQ37zMQ_
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net; // 套接字编程引入这两个命名空间
using System.Net.Sockets;
using System.Threading;
using System.IO;
using Voice;
namespace Server
{
public partial class Form1 : Form
{
private static IPEndPoint ePoint; //IP+端口号
private Socket r; //声明一个套接字r,用于语音聊天
TcpListener listener; //声明一个侦听
private int i; //声明变量i,j
private int j;
TcpClient remoteClient; //声明远程客户端
private Thread td; //声明线程td,t
private Thread t; //用于侦听语音聊天的信息
private bool connected = false;
const int BufferSize = 8192; //分配缓存大小
private WaveOutPlayer m_Player;
private WaveInRecorder m_Recorder;
private byte[] m_PlayBuffer;
private byte[] m_RecBuffer;
private FifoStream m_Fifo = new FifoStream();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)//加载用户界面
{
MessageBox.Show(this,"开启服务","提示");
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
this.ActiveControl = this.txtIP;//光标闪烁
txtRecord.Text = "【服务器运行中......】";
t = new Thread(new ThreadStart(Voice_In));//调用方法
}
private void btnConfirm_Click(object sender, EventArgs e)
{
try
{
ePoint = new IPEndPoint(IPAddress.Parse(txtIP.Text), int.Parse("8660"));
txtRecord.AppendText(Environment.NewLine);
txtRecord.Text += "【提示:】 IP已确定! ";
txtRecord.SelectionStart = txtRecord.Text.Length;
txtRecord.ScrollToCaret();
}
catch
{
txtRecord.AppendText(Environment.NewLine);
txtRecord.Text += "【提示:】 请输入有效的IP地址! ";
txtRecord.SelectionStart = txtRecord.Text.Length;
txtRecord.ScrollToCaret();
txtIP.Clear();
}
}
private void btnStart_Click(object sender, EventArgs e)
{
createLinked();//调用方法1
r = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
}
public void createLinked()//方法1:建立连接
{
try
{
listener = new TcpListener(IPAddress.Parse(txtIP.Text), 8660);//实例化一个侦听
}
catch
{
txtRecord.AppendText(Environment.NewLine);
txtRecord.Text += "【提示:】 请输入有效的IP地址! ";
txtRecord.SelectionStart = txtRecord.Text.Length;
txtRecord.ScrollToCaret();
i = 3;
}
if (i != 3)
{
try
{
listener.Start(); // 开始侦听
remoteClient = listener.AcceptTcpClient();
i = 2;
this.txtIP.Enabled = false;
this.btnConfirm.Enabled = false;
this.btnStart.Enabled = false;
td = new Thread(new ThreadStart(this.StartListen));//调用方法2
// i = 1;
td.Start();
// 打印连接到的客户端信息
txtRecord.AppendText(Environment.NewLine);
txtRecord.Text += "【提示:】 连接已建立! ";
}
catch
{
txtRecord.AppendText(Environment.NewLine);
txtRecord.Text += "【提示:】 请输入有效的IP地址! ";
txtRecord.SelectionStart = txtRecord.Text.Length;
txtRecord.ScrollToCaret();
txtIP.Clear();
}
}
}
private void StartListen()//方法2:用于侦听来自客户端的信息
{
//tcpListener = listener.AcceptTcpClient() ;
//tcpListener.Start();
while (true)
{
NetworkStream streamToClient = remoteClient.GetStream();
byte[] buffer = new byte[BufferSize];
int bytesRead = streamToClient.Read(buffer, 0, BufferSize);
//tx(bytesRead.ToString());//转换成字节数输出
// 获得请求的字符串
string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
tx(msg);
}
}
private void tx(string s)//方法3 用于改变聊天记录文本框的内容
{
txtRecord.AppendText(Environment.NewLine);//向文本框的当前文本追加文本
txtRecord.Text += "【信息来自客户端: ...】" + s;
txtRecord.Focus(); //接收到焦点
txtRecord.Select(txtRecord.Text.Length, 0);//光标移动到文本的末尾,选择字符数为0
txtRecord.ScrollToCaret();//移动滚动条
//移动滚动条到最后!
}
private void btnSend_Click(object sender, EventArgs e)
{
if (i == 2)
{
string msg = txtInput.Text;
NetworkStream streamToClient = remoteClient.GetStream();
byte[] buffer = Encoding.Unicode.GetBytes(msg); // 获得缓存
streamToClient.Write(buffer, 0, buffer.Length); // 发往客户端
txtRecord.AppendText(Environment.NewLine);
txtRecord.Text += "【发送到客户端:】 " + msg;
txtInput.Clear();
txtRecord.Focus(); //接收到焦点
txtRecord.Select(txtRecord.Text.Length, 0);//光标移动到文本的末尾,选择字符数为0
txtRecord.ScrollToCaret();//移动滚动条
//移动滚动条到最后!
}
else if (i != 3)
{
txtRecord.AppendText(Environment.NewLine);
txtRecord.Text += "【提示:】 尚未连接! ";
txtRecord.SelectionStart = txtRecord.Text.Length;
txtRecord.ScrollToCaret();
}
}
private void Voice_In() //获取语音输入流
{
byte[] br;
r.Bind(ePoint);
while (true)
{
br = new byte[16384];
try
{
r.Receive(br);
}
catch
{
}
m_Fifo.Write(br, 0, br.Length);
}
}
private void Voice_Out(IntPtr data, int size)//获取语音输入流
{
//for Recorder
if (m_RecBuffer == null || m_RecBuffer.Length < size)
m_RecBuffer = new byte[size];
System.Runtime.InteropServices.Marshal.Copy(data, m_RecBuffer, 0, size);
//Microphone ==> data ==> m_RecBuffer ==> m_Fifo
r.SendTo(m_RecBuffer, remoteClient.Client.RemoteEndPoint);
}
private void Filler(IntPtr data, int size)
{
if (m_PlayBuffer == null || m_PlayBuffer.Length < size)
m_PlayBuffer = new byte[size];
if (m_Fifo.Length >= size)
m_Fifo.Read(m_PlayBuffer, 0, size);
else
for (int i = 0; i < m_PlayBuffer.Length; i++)
m_PlayBuffer[i] = 0;
System.Runtime.InteropServices.Marshal.Copy(m_PlayBuffer, 0, data, size);
// m_Fifo ==> m_PlayBuffer==> data ==> Speakers
}
private void Start()
{
Stop();
try
{
WaveFormat fmt = new WaveFormat(44100, 16, 2);
m_Player = new WaveOutPlayer(-1, fmt, 16384, 3, new BufferFillEventHandler(Filler));
m_Recorder = new WaveInRecorder(-1, fmt, 16384, 3, new BufferDoneEventHandler(Voice_Out));
}
catch
{
Stop();
throw;
}
}
private void Stop()
{
if (m_Player != null)
try
{
m_Player.Dispose();
}
finally
{
m_Player = null;
}
if (m_Recorder != null)
try
{
m_Recorder.Dispose();
}
finally
{
m_Recorder = null;
}
m_Fifo.Flush();
}
private void btnSound_Click(object sender, EventArgs e)
{
if (i == 2)
{
j = 1;
if (connected == false)
{
t.Start();
connected = true;
}
Start();
}
else
{
txtRecord.AppendText(Environment.NewLine);
txtRecord.Text += "【提示:】 尚未连接! ";
txtRecord.SelectionStart = txtRecord.Text.Length;
txtRecord.ScrollToCaret();
}
}
private void Server_Closing(object sender, FormClosingEventArgs e)
{
if (this.listener != null)
{
listener.Stop();
}
if (td != null)
{
if (td.ThreadState == ThreadState.Running)
{
td.Abort();
}
}
if (t != null)
{
if (t.ThreadState == ThreadState.Running)
{
t.Abort();
}
}
if (j == 1)
{
r.Close();
}
}
}
}
基于C#局域网语音聊天的更多相关文章
- Python3 实现简易局域网视频聊天工具
Python3 实现简易局域网视频聊天工具 1.环境 操作系统为 Ubuntu 16.04 python 3.5opencv-python 3.4.1.15numpy 1.14.5PyAudio ...
- C#实现多人语音聊天
在上一篇文章 实现一个简单的语音聊天室(多人语音聊天系统)中,我用C#实现了一个简单的语音聊天室,并给出了源代码下载.尽管有源代码,可是非常多朋友反映,理解起来还是有些模糊.不够清楚.如今想来,是由于 ...
- 智能家居-3.基于esp8266的语音控制系统(软件篇)
智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) 赞赏支持 QQ:505645 ...
- C# 实现语音聊天
一.语音聊天说专业点就是即时语音,是一种基于网络的快速传递语音信息的技术,普遍应用于各类社交软件中,优势主要有以下几点: (1)时效性:视频直播会因为带宽问题有时出现延迟高的问题,而语音直播相对来说会 ...
- Unity3D 实现简单的语音聊天 [iOS版本]
现在很多手机游戏中的聊天系统都加入语音聊天的功能,相比于传统的文字聊天,语音聊天在MMORPG中显得尤为重要,毕竟直接口头交流总比你码字快得多了,也更直观些. 实现语音聊天的方法很多,U3D中有不少第 ...
- Android 即时语音聊天工具 开发
使用融云SDK 1. 功能需求分析 1.1 核心功能需求: * 即时通讯 * 文字聊天 * 语音聊天 1.2 辅助功能需求: * 注册.登录 * 好友添加功能 * 好友关系管理 2. 融云即时通讯平台 ...
- java版的类似飞秋的局域网在线聊天项目
原文链接:http://www.cnblogs.com/wangleiblog/articles/5323305.html 转载请注明 最近在弄一个java版的局域网在线聊天项目,功能跟飞秋差不多.p ...
- 分享基于 websocket 网页端聊天室
博客地址:https://ainyi.com/67 有一个月没有写博客了,也是因为年前需求多.回家过春节的原因,现在返回北京的第二天,想想,应该也要分享技术专题的博客了!! 主题 基于 websock ...
- cordova使用webrtc与网页端及移动端视频、语音聊天
最近在做一个移动端与移动端.网页端文字.视频.语音聊天的功能.文字聊天使用websocket,在网上很多资料,也没什么难度.但是在视频.语音聊天上遇到了小小的难点.之前一直在找一些SDK想快速开发,例 ...
随机推荐
- 关于本地模块安装入maven仓库出现的异常
Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.9.RELEASE:repackage (de ...
- testng监听ISuiteListener
实现ISuiteListener public class TestNgBeforeAction implements ISuiteListener{ public void onStart(ISui ...
- Azure VM从ASM迁移到ARM(一)
Azure的IaaS有ASM和ARM两个版本,ARM的一些优点前面已经聊过很多了.ARM有更细的管理颗粒度,更多的功能等. 如果想从ASM迁移到ARM,目前有两类方法可以实现: 1. Azure平台支 ...
- Nginx解决错误413 Request Entity Too Large
最近一个项目当中,要求上传图片,并且限制图片大小,虽然在laravel当中已经添加了相关的表单验证来阻止文件过大的上传,然而当提交表单时,还没轮到laravel处理,nginx就先报错了.当你仔细看报 ...
- extern关键字祥解
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...
- 查看,创建,删除,映射rbd镜像
标签(空格分隔): ceph,ceph实验,pg 1. 创建镜像: [root@node3 ~]# rbd create testpool/foo --size 1024 2. 查看镜像信息: [ro ...
- asp.netcore di 实现批量接口注入
废话少说,先上代码 public static Dictionary<Type, Type[]> GetImpleAndInterfaces(string assemblyName,str ...
- scp命令 跨服务器传输
scp命令用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器硬盘变为只读read onl ...
- KNN算法实现
import csvimport randomimport mathimport operatorimport numpy as np def loadDataset(filename,split,t ...
- 吐槽下linq to sql的分页功能
在调试程序的时候发现一个非常奇怪的问题: 用使用linq分页,分页到第二页的时候,第二页里面有第一页里出现的数据,开始还以为是. linq语句写的有问题,调试半天,无解.后来发现是因为没有排序的缘故. ...