通过 tcpserver 向客户端发送 Mp3 文件
Sending Mp3 File via tcpserver to a client
我有一个 tcp 客户端如下:
public static void RunStream()
{
Console.WriteLine("Starting Stream...");
TcpListener listen = new TcpListener(IPAddress.Parse("127.0.0.1"), 13000);
listen.Start();
while (true)
{
Console.Write("Waiting for a connection... ");
Socket socket = listen.AcceptSocket();
if (socket.Connected)
{
SendFile(socket);
socket.Disconnect(false);
}
}
}
public static void SendFile(Socket socket)
{
NetworkStream netstream = new NetworkStream(socket);
StreamWriter writer = new StreamWriter(netstream);
FileStream fileStream = File.Open("file_example_MP3_700KB.mp3", FileMode.Open, FileAccess.Read, FileShare.Read);
fileStream.CopyTo(netstream);
netstream.Flush();
netstream.Close();
}
static void Main(string[] args)
{
RunStream();
}
和一个从服务器读取并保存流(包含 mp3 文件)的客户端,如下所示:
static void Main(string[] args)
{
TcpClient client = new TcpClient("127.0.0.1", 13000);
byte[] bytes = new byte[2100000];
var stream = client.GetStream();
int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
stream.Write(bytes, 0, i);
}
File.WriteAllBytes("test.mp3", bytes);
stream.Flush();
client.Close();
}
问题是我只得到了原始 mp3 的片段,例如,如果原始文件有 24 秒的持续时间,我只得到前 5-8
兄弟你在客户端写了stream.Read(bytes, 0, bytes.Length)
这意味着你每次读取数据都要重写数组
并且你使用一个大数组来保存你的数据,如果你发送一个大文件,这将产生问题
像这样更好的代码兄弟:
static void Main(string[] args)
{
TcpClient client = new TcpClient("127.0.0.1", 13000);
var stream = client.GetStream();
byte[] buff = new byte[1024]; //you can change length later, bigger arrays have more reading speed but give more ram
FileStream filestream = new FileStream("test.mp3", FileMode.Create);
while (stream.Length > stream.Position)
{
int readLength = stream.Read(buff, 0, buff.Length);
filestream.Write(buff, 0, readLength);
}
stream.Flush();
client.Close();
}
我有一个 tcp 客户端如下:
public static void RunStream()
{
Console.WriteLine("Starting Stream...");
TcpListener listen = new TcpListener(IPAddress.Parse("127.0.0.1"), 13000);
listen.Start();
while (true)
{
Console.Write("Waiting for a connection... ");
Socket socket = listen.AcceptSocket();
if (socket.Connected)
{
SendFile(socket);
socket.Disconnect(false);
}
}
}
public static void SendFile(Socket socket)
{
NetworkStream netstream = new NetworkStream(socket);
StreamWriter writer = new StreamWriter(netstream);
FileStream fileStream = File.Open("file_example_MP3_700KB.mp3", FileMode.Open, FileAccess.Read, FileShare.Read);
fileStream.CopyTo(netstream);
netstream.Flush();
netstream.Close();
}
static void Main(string[] args)
{
RunStream();
}
和一个从服务器读取并保存流(包含 mp3 文件)的客户端,如下所示:
static void Main(string[] args)
{
TcpClient client = new TcpClient("127.0.0.1", 13000);
byte[] bytes = new byte[2100000];
var stream = client.GetStream();
int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
stream.Write(bytes, 0, i);
}
File.WriteAllBytes("test.mp3", bytes);
stream.Flush();
client.Close();
}
问题是我只得到了原始 mp3 的片段,例如,如果原始文件有 24 秒的持续时间,我只得到前 5-8
兄弟你在客户端写了stream.Read(bytes, 0, bytes.Length)
这意味着你每次读取数据都要重写数组
并且你使用一个大数组来保存你的数据,如果你发送一个大文件,这将产生问题
像这样更好的代码兄弟:
static void Main(string[] args)
{
TcpClient client = new TcpClient("127.0.0.1", 13000);
var stream = client.GetStream();
byte[] buff = new byte[1024]; //you can change length later, bigger arrays have more reading speed but give more ram
FileStream filestream = new FileStream("test.mp3", FileMode.Create);
while (stream.Length > stream.Position)
{
int readLength = stream.Read(buff, 0, buff.Length);
filestream.Write(buff, 0, readLength);
}
stream.Flush();
client.Close();
}