基​于​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

基于C#局域网语音聊天相关推荐

  1. 基于Internet的语音聊天软件设计与实现

    基于Internet的语音聊天软件设计与实现 朱国华,夏敏捷 (中原工学院 计算机科学系 ,河南 郑州 450007) 摘要:文章对网络环境下语音通信的原理进行了系统地分析,详细阐述了语音的采集.语音 ...

  2. 局域网语音聊天 第一篇 简介

    由于工作需要,最近花了半个月封装了基因局域网语音聊天封装的dll.实现的基本功能如下所示,将相关点记录下来,方便下次使用 其中涉及到的几个知识点: 1.用portaudio 采集声音 2.用opus对 ...

  3. 基于vfw的局域网语音聊天室系统源码论文

    语音视频聊天 UDP套接字的运用 在实现语音视频聊天时,采用的是基于UDP套接字的点对点模式,而UDP面向的是无连接的数据服务,其套接字的使用如图10所示. 图10 UDP套接字的使用 视频的捕获 利 ...

  4. 基于nodejs的语音聊天

    描述 程序在 iamshaunjp 的群聊功能基础上利用webRTC技术,添加了语音群聊功能,在其他人键盘输入时,会出现类似微信的对方正在输入字样. demo:https://biptedu.cn:4 ...

  5. JAVA基于局域网的聊天室系统(源代码+论文)

    毕业论文 局域网聊天室系统的设计与实现 论文作者姓名: 申请学位专业: 申请学位类别: 指导教师姓名(职称): 论文提交日期: 基于局域网的视频聊天室系统的设计与实现 摘 要 视频聊天系统作为一种新型 ...

  6. 局域网通信 | 基于广播实现简易聊天室

    前言 事情是这个样子的,实验室的那个横向项目有一个需求:同一个 WIFI 下的设备之间可以实现实时的语音聊天. 于是这两天抽空闲时间捣鼓了一下局域网通信.现在基本实现语音通信了,是基于 UDP 广播实 ...

  7. linux局域网语音通讯软件下载,基于Linux平台的局域网可语音的IM软件的设计与实现.doc...

    基于Linux平台的局域网可语音的IM软件的设计与实 作者: 专业:软件工程 指导老师: 摘要 随着计算机网络的日益普及人们通过网络进行交流显得越来越重要.于是出现了一系列的通信软件. 自1990s ...

  8. #实现互联网聊天_局域网内两台电脑如何实时语音聊天通话

    有的人想实现局域网内实时语音通话的功能,如果电脑可以连接互联网的话,可安装QQ,电脑版微信等进行实时语音聊天,如果电脑只连接了内网,并未连接因特网,该怎么实现呢?其实不难,只需要通过局域网声音传输软件 ...

  9. 基于UDP协议的局域网网络聊天工具

    /* * 本程序实现了基于UDP协议的局域网网络聊天工具. * 参考网上的源码,发现一个calss就可以搞定. * ChatFrame类创建窗口,包含JTextField和TextArea. * 前者 ...

最新文章

  1. Coursera, Big Data 1, Introduction (week 3)
  2. 【POJ 2942】Knights of the Round Table(点双连通分量,二分图染色)
  3. FSNotes for Mac(强大的文本编辑器)
  4. 运营、AI、Python数据分析,这3场直播你别错过
  5. SQLALchemy (ORM工具)[PostgreSQL为例]
  6. mac 配置mysql 环境变量
  7. SmartFoxServer,多人flash游戏开发
  8. Win7更换锁屏和开机画面
  9. PhotoShop基础
  10. 微医与友邦中国战略合作,智能医务室为职员健康护航
  11. Gateway整合Nacos前端请求报错404 NOT_FOUNT
  12. WuThreat身份安全云-TVD每日漏洞情报-2023-02-07
  13. 如何判断应变片式压力传感器是否损坏
  14. 【华人学者风采】赵军 中国科学院自动化所
  15. Android AbsoluteLayout布局(绝对布局)
  16. 读《人性的弱点:如何赢得友谊并影响他人(完整版插图本》
  17. Unity2DRelative Joint 2D详解
  18. jQuery ajax bootstrap layui
  19. 弹性力学——一些知识
  20. STM32 使用STM32F103控制无源蜂鸣器发声播放音乐

热门文章

  1. Linux中搭建Maven私服
  2. 聊聊微服务的服务注册与发现
  3. 微信小程序之wx:if视图层的条件渲染
  4. python中删除列表中的空元素以及如何读取excel中的数据
  5. TeskLink—增加一种需求类型(业务流程)(version1.9.8)
  6. 也做SQL查询:班级总成绩 前三名,总成绩有相等的情况
  7. 树形DP题目。。。转载
  8. Tomcat 相关配置
  9. Spring 配置文件的差异
  10. ajax基础学习笔记