基于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
總結
以上是生活随笔為你收集整理的基于C#局域网语音聊天的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Shell--shell中的判断
- 下一篇: 图像的读取,显示与保存(基于skimag