C# 从TCP套接字接收和发送连续数据

C# 从TCP套接字接收和发送连续数据,c#,networking,audio,tcp,handler,C#,Networking,Audio,Tcp,Handler,我已经疯了。所以我决定寻求帮助 场景:在网页中,通过TCP套接字连接到服务器,然后在循环中逐字节获取数据。这些数据是连续的 问:我如何制作一个WebSocket来接收和发送数据给播放器(html5标签) Default.aspx <asp:Literal ID="ltrPlayer" runat="server" /> Default.aspx.cs protected void Page_Load(object sender, EventArgs e) { strin

我已经疯了。所以我决定寻求帮助

场景:在网页中,通过TCP套接字连接到服务器,然后在循环中逐字节获取数据。这些数据是连续的

问:我如何制作一个WebSocket来接收和发送数据给播放器(html5标签)

Default.aspx

<asp:Literal ID="ltrPlayer" runat="server" />

Default.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    string tele = HttpContext.Current.Request.QueryString["tele"];
    string ramal = HttpContext.Current.Request.QueryString["ramal"];
    string dac = HttpContext.Current.Request.QueryString["dac"];
    string cti = HttpContext.Current.Request.QueryString["cti"];

    if ((tele != null) && (ramal != null) && (dac != null) && (cti != null))
    {
        string strAudio = "<audio controls='controls'>";
        strAudio += "<source src='Play.ashx?tele=" + tele + "&ramal=" + ramal + "&dac=" + dac + "&cti=" + cti + "' type='audio/x-wav' controls preload='auto'>";
        strAudio += "Seu browser não oferece suporte a este player.";
        strAudio += "</audio>";

        ltrPlayer.Text = strAudio;
    }
}
受保护的无效页面加载(对象发送方,事件参数e)
{
string tele=HttpContext.Current.Request.QueryString[“tele”];
字符串ramal=HttpContext.Current.Request.QueryString[“ramal”];
字符串dac=HttpContext.Current.Request.QueryString[“dac”];
字符串cti=HttpContext.Current.Request.QueryString[“cti”];
if((tele!=null)&&(ramal!=null)&&&(dac!=null)&&(cti!=null))
{
字符串strAudio=“”;
strAudio+=“”;
strAudio+=“东南大学浏览器não of erece支持一名este玩家。”;
strAudio+=“”;
ltrPlayer.Text=strAudio;
}
}
Play.ashx

<%@ WebHandler Language="C#" Class="Play" %>

using System;
using System.Web;

using System.Net;
using System.IO;
using Alvas.Audio; // Make the conversion VOX to WAV
using System.Media;
using System.Configuration;

using System.Net.Sockets;
using System.Text;


public class Play : IHttpHandler
{
    private NetworkStream ns;

    public void ProcessRequest(HttpContext context)
    {
        string tele = HttpContext.Current.Request.QueryString["tele"];
        string ramal = HttpContext.Current.Request.QueryString["ramal"];
        string dac = HttpContext.Current.Request.QueryString["dac"];
        string cti = HttpContext.Current.Request.QueryString["cti"];   

        if ((tele != null) && (ramal != null) && (dac != null) && (cti != null))
        {
            try
            {
                TcpClient oClient = new TcpClient();

                oClient.Connect(tele, 22000);

                ns = oClient.GetStream();
                write(ns, "ondelogar");

                ns = oClient.GetStream();
                write(ns, "monitorarRamalViaRede(tele;ramal;dac;cti)");

                Thread.Sleep(1000);                

                do
                {
                    if (oClient.GetStream().DataAvailable == true)
                    {
                        using (StringReader reader = new StringReader(read(ns)))
                        {
                            string line;

                            while ((line = reader.ReadLine()) != null)
                            {
                                Byte[] byteOut = new Byte[line.Length / 2];

                                int i = 0;
                                while (i < (line.Length / 2))
                                {
                                    byteOut[i / 2] = Convert.ToByte(line.Substring(i, 2), 16);
                                    i = i + 2;
                                }

                                Stream s = new MemoryStream(byteOut);
                                BinaryReader br = new BinaryReader(s);
                                MemoryStream pcmStream = new MemoryStream();
                                IntPtr pcmFormat = AudioCompressionManager.GetPcmFormat(1, 16, 6000);
                                WaveWriter ww = new WaveWriter(pcmStream, AudioCompressionManager.FormatBytes(pcmFormat));
                                Vox.Vox2Wav(br, ww);
                                WaveReader wr = new WaveReader(pcmStream);

                                byte[] pcmData = pcmStream.ToArray();

                                br.Close();
                                ww.Close();
                                wr.Close();
                                pcmStream.Close();
                                Array.Clear(byteOut, 0, byteOut.Length);

                                HttpContext.Current.Response.Clear();
                                HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename=\"{0}\"", "BufferDeAudio"));
                                HttpContext.Current.Response.ContentType = "audio/x-wav";
                                HttpContext.Current.Response.BinaryWrite(pcmData);
                                HttpContext.Current.Response.End();             
                            }
                        }
                    }
                }
                while (oClient.GetStream().DataAvailable == true);

                ns.Close();
            }
            catch (Exception)
            {

            }

            HttpContext.Current.Response.End();
        }
    }

    private void write(NetworkStream ns, string message)
    {
        byte[] msg = Encoding.ASCII.GetBytes(message + Environment.NewLine);
        ns.Write(msg, 0, msg.Length);
    }

    private string read(NetworkStream ns)
    {
        StringBuilder sb = new StringBuilder();

        if (ns.CanRead)
        {
            byte[] readBuffer = new byte[1024];

            int numBytesRead = 0;

            do
            {
                numBytesRead = ns.Read(readBuffer, 0, readBuffer.Length);
                sb.AppendFormat("{0}", Encoding.ASCII.GetString(readBuffer, 0, numBytesRead));
                sb.Replace(Convert.ToChar(24), ' ');
                sb.Replace(Convert.ToChar(255), ' ');
                sb.Replace('?', ' ');
            }

            while (ns.DataAvailable);
        }

        return sb.ToString();
        }                                        

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}
public void ProcessRequest(HttpContext context)
{
    string tele = HttpContext.Current.Request.QueryString["tele"];
    string ramal = HttpContext.Current.Request.QueryString["ramal"];
    string dac = HttpContext.Current.Request.QueryString["dac"];
    string cti = HttpContext.Current.Request.QueryString["cti"];

    if ((tele != null) && (ramal != null) && (dac != null) && (cti != null))
    {
        string strLine = string.Empty;
        string strNewLine = string.Empty;
        int intCountBuffer = 0;

        MemoryStream pcmStream = null;
        MemoryStream audioStream = null;
        bool blnArmazenarBuffer = true;

        try
        {
            TcpClient oClient = new TcpClient();
            oClient.Connect(tele, 22000);

            ns = oClient.GetStream();
            write(ns, "ondelogar");

            ns = oClient.GetStream();
            write(ns, "monitorarRamalViaRede(" + tele + ";" + ramal + ";" + dac + ";" + cti + ")");

            Thread.Sleep(1000);




            context.Response.ClearContent();
            context.Response.ClearHeaders();
            context.Response.BufferOutput = false;
            context.Response.AddHeader("Content-Disposition", "attachment; filename=Gravacao");
            context.Response.ContentType = "audio/x-wav";

            int readCount;
            byte[] data = new byte[oClient.ReceiveBufferSize];

            while ((readCount = ns.Read(data, 0, oClient.ReceiveBufferSize)) != 0)
            {
                using (StringReader readerTest = new StringReader(read(ns)))
                {
                    strLine = readerTest.ReadLine();

                    if (strLine.Substring(0, 13) == "BufferDeAudio")
                    {
                        strLine = strLine.Replace("BufferDeAudio(", string.Empty);
                        strLine = strLine.Replace(")", string.Empty);
                        strLine = strLine.Replace(" ", string.Empty);
                        strLine = strLine.Trim();

                        if (blnArmazenarBuffer == true)
                        {
                            strNewLine += strLine;
                            intCountBuffer++;

                            // Holds 10 packages (or 10 seconds) in buffer
                            // Note: Only for ensuring that the first transmission is delivered.
                            if (intCountBuffer >= 10)
                            {
                                pcmStream = VoxToWav(strNewLine);
                                strNewLine = string.Empty;

                                // ChunkSize
                                // Note. See the documentation on: https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
                                pcmStream.Position = 4;
                                pcmStream.WriteByte(12);

                                pcmStream.Position = 5;
                                pcmStream.WriteByte(77);

                                pcmStream.Position = 6;
                                pcmStream.WriteByte(104);

                                pcmStream.Position = 7;
                                pcmStream.WriteByte(28);

                                // SubChunk2Size
                                pcmStream.Position = 40;
                                pcmStream.WriteByte(232);

                                pcmStream.Position = 41;
                                pcmStream.WriteByte(76);

                                pcmStream.Position = 42;
                                pcmStream.WriteByte(104);

                                pcmStream.Position = 43;
                                pcmStream.WriteByte(28);

                                if (context.Response.IsClientConnected)
                                {
                                    // The first time you step through the loop, i send wav header
                                    audioStream = new MemoryStream();

                                    audioStream.Position = 0;
                                    pcmStream.Position = 0;
                                    audioStream.Write(pcmStream.ToArray(), 0, (Int32)pcmStream.Length);
                                }

                                blnArmazenarBuffer = false;
                            }
                        }
                        else
                        {
                            pcmStream = VoxToWav(strLine);
                            strLine = string.Empty;

                            if (context.Response.IsClientConnected)
                            {
                                // Here I have already sent the header. So no need to send it over again.
                                audioStream = new MemoryStream();

                                byte[] arr1 = pcmStream.ToArray();

                                int x = 44;

                                while (x < (arr1.Length))
                                {
                                    audioStream.Position = x - 44;
                                    audioStream.WriteByte(arr1[x]);

                                    x++;
                                }
                            }
                        }

                        context.Response.OutputStream.Write(audioStream.ToArray(), 0, (Int32)audioStream.Length);
                        context.Response.OutputStream.Flush();
                        context.Response.OutputStream.Close();

                        audioStream.Dispose();
                    }
                }
            }
        }
        catch (Exception ex)
        {
            if (File.Exists(path))
            {
                StreamWriter w = File.AppendText(path);

                w.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString());
                w.WriteLine("  :");
                w.WriteLine("  :{0}", "Play.ashx");
                w.WriteLine("  :{0}", ex.Message);
                w.WriteLine("-------------------------------");

                w.Flush();
                w.Close();
            }
        }

        ns.Close();
    }
}

private void write(NetworkStream ns, string message)
{
    byte[] msg = Encoding.ASCII.GetBytes(message + Environment.NewLine);
    ns.Write(msg, 0, msg.Length);
}

private string read(NetworkStream ns)
{
    StringBuilder sb = new StringBuilder();

    if (ns.CanRead)
    {
        byte[] readBuffer = new byte[1024];

        int numBytesRead = 0;

        do
        {
            numBytesRead = ns.Read(readBuffer, 0, readBuffer.Length);
            sb.AppendFormat("{0}", Encoding.ASCII.GetString(readBuffer, 0, numBytesRead));
            sb.Replace(Convert.ToChar(24), ' ');
            sb.Replace(Convert.ToChar(255), ' ');
            sb.Replace('?', ' ');
        }

        while (ns.DataAvailable);
    }

    return sb.ToString();
}

private MemoryStream VoxToWav(string strLine)
{
    //How do I get the data in hexadecimal. This trick is to order them in pairs.
    byte[] byteOut = new byte[strLine.Length / 2];

    int j = 0;
    while (j < (strLine.Length))
    {
        byteOut[j / 2] = Convert.ToByte(strLine.Substring(j, 2), 16);
        j = j + 2;
    }

    Stream s = new MemoryStream(byteOut);
    BinaryReader br = new BinaryReader(s);
    MemoryStream pcmStream = new MemoryStream();
    IntPtr pcmFormat = AudioCompressionManager.GetPcmFormat(1, 16, 6000);
    WaveWriter ww = new WaveWriter(pcmStream, AudioCompressionManager.FormatBytes(pcmFormat));
    Vox.Vox2Wav(br, ww);

    return pcmStream;
}

public bool IsReusable
{
    get
    {
        return false;
    }
}

使用制度;
使用System.Web;
Net系统;
使用System.IO;
使用Alvas.Audio;//将VOX转换为WAV
使用系统、媒体;
使用系统配置;
使用System.Net.Sockets;
使用系统文本;
公开课剧目:伊赫特芬德勒
{
专用网络;
公共void ProcessRequest(HttpContext上下文)
{
string tele=HttpContext.Current.Request.QueryString[“tele”];
字符串ramal=HttpContext.Current.Request.QueryString[“ramal”];
字符串dac=HttpContext.Current.Request.QueryString[“dac”];
字符串cti=HttpContext.Current.Request.QueryString[“cti”];
if((tele!=null)&&(ramal!=null)&&&(dac!=null)&&(cti!=null))
{
尝试
{
TcpClient oClient=新的TcpClient();
oClient.Connect(电话,22000);
ns=oClient.GetStream();
写入(ns,“ondelogar”);
ns=oClient.GetStream();
书写(ns,“监控系统(tele;ramal;dac;cti)”;
睡眠(1000);
做
{
if(oClient.GetStream().DataAvailable==true)
{
使用(StringReader=新StringReader(读取(ns)))
{
弦线;
而((line=reader.ReadLine())!=null)
{
Byte[]byteOut=新字节[line.Length/2];
int i=0;
而(i<(行长/2))
{
字节输出[i/2]=转换为字节(行子字符串(i,2),16);
i=i+2;
}
流s=新内存流(字节输出);
BinaryReader br=新的BinaryReader;
MemoryStream pcmStream=新的MemoryStream();
IntPtr pcmFormat=AudioCompressionManager.GetPcmFormat(1,16,6000);
WaveWriter ww=新的WaveWriter(pcmStream,AudioCompressionManager.FormatBytes(pcmFormat));
Vox.Vox2Wav(br,ww);
读波器wr=新的读波器(pcmStream);
字节[]pcmData=pcmStream.ToArray();
br.Close();
ww.Close();
wr.Close();
pcmStream.Close();
Array.Clear(byteOut,0,byteOut.Length);
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader(“内容处置”,string.Format(“附件;文件名=\”{0}\”,“BufferDeAudio”);
HttpContext.Current.Response.ContentType=“audio/x-wav”;
HttpContext.Current.Response.BinaryWrite(pcmData);
HttpContext.Current.Response.End();
}
}
}
}
while(oClient.GetStream().DataAvailable==true);
ns.Close();
}
捕获(例外)
{
}
HttpContext.Current.Response.End();
}
}
私有无效写入(网络流ns、字符串消息)
{
byte[]msg=Encoding.ASCII.GetBytes(message+Environment.NewLine);
ns.Write(msg,0,msg.Length);
}
私有字符串读取(NetworkStream ns)
{
StringBuilder sb=新的StringBuilder();
如果(ns.CanRead)
{
字节[]读缓冲区=新字节[1024];
int numBytesRead=0;
做
{
numBytesRead=ns.Read(readBuffer,0,readBuffer.Length);
sb.AppendFormat(“{0}”,Encoding.ASCII.GetString(readBuffer,0,numBytesRead));
sb.替换(转换为第(24)款,“”);
sb.替换(转换为ToChar(255),“”);
替换(“?”,“);
}
而(ns.DataAvailable),;
}
使某人返回字符串();
}                                        
公共布尔可重用
{
得到
{
返回false;
}
}
}
然后,当循环逐行接收数据时,我向播放器发送数据。但我听到的唯一声音是循环的最后一行

我试着让那个玩家陷入困境,但没有成功


这可能吗?有什么想法吗?

关闭while循环中的响应流。这将关闭连接并中断传出流

考虑以下情况:

HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader(...))
HttpContext.Current.Response.ContentType = "audio/x-wav";

...

while ((line = reader.ReadLine()) != null)
{
    ...

    HttpContext.Current.Response.BinaryWrite(pcmData);
    HttpContext.Current.Response.Flush();
}
HttpContext.Current.Response.End();            
赛后