基于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();
            }
        }

}
}

原文地址:https://www.cnblogs.com/asdyzh/p/9940783.html

时间: 2024-10-21 14:03:22

基于C#局域网语音聊天的相关文章

实现一个简单的语音聊天室(多人语音聊天系统)

多人语音聊天,或语音聊天室,是即时通信应用中常见的功能之中的一个,比方,QQ的语音讨论组就是我们用得比較多的. 本文将基于最新版本号的OMCS(V3.5)实现一个简单的语音聊天室,让多个人能够进入同一个房间进行语音沟通.当然,在此之前,您必须对OMCS有所了解,而且已经阅读.理解了OMCS 开发手冊(08) -- 多人语音/视频这篇文章的内容.先看看Demo执行效果截图:        从左到右的三张图各自是:登录界面.语音聊天室的主界面.标注了各个控件的主界面. 一. C/S结构 非常明显,我

C#实现多人语音聊天

在上一篇文章 实现一个简单的语音聊天室(多人语音聊天系统)中,我用C#实现了一个简单的语音聊天室,并给出了源码下载.虽然有源码,但是很多朋友反映,理解起来还是有些模糊.不够清楚.现在想来,是因为我忘了先将底层的原理介绍一下,语音聊天室是基于OMCS实现的,那么这里我就补上OMCS中与多人语音视频相关部分的原理及方案的介绍. 一. 动态组 OMCS采用"动态组"的模式来实现多人语音/视频聊天组,所谓"动态组",就是在运行时动态创建和销毁的组,其包含如下几层意思: (1

实现一个简单的语音聊天室(源码)

语音聊天室,或多人语音聊天,是即时通信应用中常见的功能之一,比如,QQ的语音讨论组就是我们用得比较多的. 这篇文章将实现一个简单的语音聊天室,让多个人可以进入同一个房间进行语音沟通.先看运行效果截图:         从左到右的三张图分别是:登录界面.语音聊天室的主界面.标注了各个控件的主界面. (如果觉得界面太丑,没关系,后面下载源码后,你可以自己美化~~) 一. C/S结构 很明显,我这个语音聊天室采用的是C/S结构,整个项目结构相对比较简单,如下所示: 该项目的底层是基于OMCS构建的.这

用C/S技术开发语音聊天软件有什么特点?

上一期我们说过B/S技术开发聊天有什么优点,这一期我们就来简单的说说用C/S技术开发又有什么特点? 一.稳定性和灵活性:用C/S技术可以将应用和服务进行分离. 二.安全性:C/S对应是的是结构模式,一般只适用于局域网,所以安全性比较好. 三.速度快:客户端与服务器端是直接连接的,中间没有经过别的环节,所以响应速度非常快. 四.升级维护复杂:如果软件需要升级维护,那么每一台客户的机子都要进行相应的升级维护服务,那么这个过程肯定是比较繁琐的. 综上所述,对于不同的聊天室需要采用不同的开发技术,但是国

如何实现百万级的语音聊天室

上篇我们介绍了如何从零开始搭建一套语音聊天室后台,设计方案比较基础,本篇我们将介绍语音聊天室的升级版本——在海量用户同时在线的情况下,语音服务器的架构将如何升级改造. 互联网产品后台开发信奉一句话:先扛住再优化.工程师当然是希望把系统设计得尽善尽美,但是业务发展往往是不允许的,因此后台工程师的工作就是在技术和业务之间寻找平衡点.大部分的系统都是逐步迭代演进而来的,没有一蹴而就的完美系统. 前文中,我们介绍了语音服务器分SET部署的概念.其实一直在回避一个问题,分SET的缺点是什么? 分SET限制

cordova使用webrtc与网页端及移动端视频、语音聊天

最近在做一个移动端与移动端.网页端文字.视频.语音聊天的功能.文字聊天使用websocket,在网上很多资料,也没什么难度.但是在视频.语音聊天上遇到了小小的难点.之前一直在找一些SDK想快速开发,例如opentok.云通讯等,但是项目的使用环境是内网,这些SDK必须要在外网情况下才能使用,需要在他们的服务器上获取信令.后来就想办法自己用webrtc做一个视频语音聊天,因为已经用了websocket了.在webrtc的官网,看源码安卓有3G多,编译后差不多9G,直接吓尿了.就算写了插件给cord

Unity3D 实现简单的语音聊天 [Android版本]

上次简单说了iOS版本的聊天功能 Unity3D 实现简单的语音聊天 [iOS版本] 这次我们接着上篇来说下Android版本来实现简单的语音聊天,流程和iOS基一样的 @[email protected] 在这里我们可能会遇到一下问题: 1.U3D C# 与 Android Java之间是怎么通讯 2.Android怎么调用原生的录音功能和播放功能 好,我们逐一解决问题 1.U3D C# 与 Android Java之间是怎么通讯 相比iOS,Android这边会比较简单些 再C# 中这样调用

树莓派-语音聊天机器人+语音控制引脚电平高低

最近和几位本学院的研究生师兄师姐参加研究生电子设计大赛,自己也来折腾下之前没有搞完的语音控制小车.恰巧自己负责的是语音控制这部分,折腾了几天也差不多搞定啦…把自己的折腾套路总结一下,给一起折腾的小伙伴点经验之谈… 一.配置树莓派 我们这次使用的最新的树莓派3,镜像直接是官网下载的Raspbian.这也是让我感觉最有树莓派感觉的一个系统.主要是sudo raspi-config的配置. 1和2最好都是设置一下,然后3看自己爱好吧:4的里面我都是重新设置的,包括时区.语言和字体.字体最好下载(apt

基于文件形式的聊天工具

前因 由于在甲方公司领导要求,在上班时禁止一切的聊天工具的出现.各种封IM软件或者端口.但是开发人员和测试人员相隔半天街,所以,一直想整个简单且不用网络的聊天的工具. 思索半天,遇到以下问题: 我们方的IP地址和甲方人员的不是同网段的 每次交流,除了邮件,就是靠吼 几个人用的系统有几种:xp,win8, win7, mac 网段不一样,某些内网,我们外部不能访问 有以下共同点: 都可以访问某个服务器(因为得时不时看下测试日志) 都会基础的Linux命令 简单,又不用网络的,到底可以做神马呢? 就