基​于​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#局域网语音聊天的更多相关文章

  1. Python3 实现简易局域网视频聊天工具

    Python3 实现简易局域网视频聊天工具   1.环境 操作系统为 Ubuntu 16.04 python 3.5opencv-python 3.4.1.15numpy 1.14.5PyAudio ...

  2. C#实现多人语音聊天

    在上一篇文章 实现一个简单的语音聊天室(多人语音聊天系统)中,我用C#实现了一个简单的语音聊天室,并给出了源代码下载.尽管有源代码,可是非常多朋友反映,理解起来还是有些模糊.不够清楚.如今想来,是由于 ...

  3. 智能家居-3.基于esp8266的语音控制系统(软件篇)

    智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) 赞赏支持 QQ:505645 ...

  4. C# 实现语音聊天

    一.语音聊天说专业点就是即时语音,是一种基于网络的快速传递语音信息的技术,普遍应用于各类社交软件中,优势主要有以下几点: (1)时效性:视频直播会因为带宽问题有时出现延迟高的问题,而语音直播相对来说会 ...

  5. Unity3D 实现简单的语音聊天 [iOS版本]

    现在很多手机游戏中的聊天系统都加入语音聊天的功能,相比于传统的文字聊天,语音聊天在MMORPG中显得尤为重要,毕竟直接口头交流总比你码字快得多了,也更直观些. 实现语音聊天的方法很多,U3D中有不少第 ...

  6. Android 即时语音聊天工具 开发

    使用融云SDK 1. 功能需求分析 1.1 核心功能需求: * 即时通讯 * 文字聊天 * 语音聊天 1.2 辅助功能需求: * 注册.登录 * 好友添加功能 * 好友关系管理 2. 融云即时通讯平台 ...

  7. java版的类似飞秋的局域网在线聊天项目

    原文链接:http://www.cnblogs.com/wangleiblog/articles/5323305.html 转载请注明 最近在弄一个java版的局域网在线聊天项目,功能跟飞秋差不多.p ...

  8. 分享基于 websocket 网页端聊天室

    博客地址:https://ainyi.com/67 有一个月没有写博客了,也是因为年前需求多.回家过春节的原因,现在返回北京的第二天,想想,应该也要分享技术专题的博客了!! 主题 基于 websock ...

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

    最近在做一个移动端与移动端.网页端文字.视频.语音聊天的功能.文字聊天使用websocket,在网上很多资料,也没什么难度.但是在视频.语音聊天上遇到了小小的难点.之前一直在找一些SDK想快速开发,例 ...

随机推荐

  1. 使用.NET中的XML注释(二) -- 创建帮助文档入门篇

    一.摘要 在本系列的第一篇文章介绍了.NET中XML注释的用途, 本篇文章将讲解如何使用XML注释生成与MSDN一样的帮助文件.主要介绍NDoc的继承者:SandCastle. 二.背景 要生成帮助文 ...

  2. 使用自定义端口连接SQL Server 2008的方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 使用过SQL Server的人大多都知道,SQL Server服务器默认监听的端口号是1433,但是我今天遇到的问题是我的机器上有三个数据库实例, ...

  3. 解决count distinct多个字段的方法

    Distinct的作用是用于从指定集合中消除重复的元组,经常和count搭档工作,语法如下 COUNT( { [ ALL | DISTINCT ] expression ] | * } ) 这时,可能 ...

  4. JSON-lib框架,转换JSON、XML

    json-lib工具包 下载地址: http://sourceforge.net/projects/json-lib/json-lib还需要以下依赖包: jakarta commons-lang 2. ...

  5. java添加背景图片

    总结:我们通常实现添加背景图片很容易,但是再添加按钮组件就会覆盖图片.原因是: 有先后啊.setlayout();与布局有很大关系 请调试代码的时候,仔细揣摩.我晕了 还可以添加文本框,密码框 fra ...

  6. mjpg-streamer移植

    本文的copyright归yuweixian4230@163.com 所有,使用GPL发布,可以自由拷贝,转载.但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途. 作者:yuweix ...

  7. 【转】Rails中Bootstrap的安装和使用

     转自:http://blog.csdn.net/lissdy/article/details/9195651   眼看着前端攻城师们都开始使用Bootstrap创作网页,于是也想学着在最近正在学习的 ...

  8. Ubuntu 开启telnet、ftp服务

    Telnet 这里我们就来对Ubuntu Linux telnet的安装设置进行一下讲解. 1. sudo apt-get install xinetd telnetd 2. Ubuntu Linux ...

  9. Struts2+Hibernate+Spring 整合示例

    转自:https://blog.csdn.net/tkd03072010/article/details/7468769 Struts2+Hibernate+Spring 整合示例 Spring整合S ...

  10. linux命令-sudo普通用户拥有root权限

    普通用户权限不够 [root@wangshaojun ~]# su - dennywang[dennywang@wangshaojun ~]$ ls /root/ls: 无法打开目录/root/: 权 ...