C# 文件传输 我现在想做一个Socket 服务器端与客户端,用来传输文件,求思路服务器端读取本地文件,然后把数据流发送到客户端,客户端怎样才能把数据流转换成原始数据呢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 TcpClient,TcpListener用来监听和传输FileStream来读取和写入文件 如果想用socket ,那就只能通过字节流 ,也就是byte[],因为socket只能支持这个类型的数据 。然后你可以通过转换数据类型来办到 。其实用socket的还是挺多的 ,很好找 。 byte[] -> stream -> filestream ->file? 部分代码Dictionary<string, ConnectionClient> dictConn = new Dictionary<string, ConnectionClient>(); //选择要发送的文件 private void btnChooseFile_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { txtFilePath.Text = ofd.FileName; } } //发送文件 private void btnSendFile_Click(object sender, EventArgs e) { //拿到下拉框中选中的客户端IPPORT string key = cboClient.Text; if (!string.IsNullOrEmpty(key)) { dictConn[key].SendFile(txtFilePath.Text.Trim()); } } http://www.cnblogs.com/fence/archive/2010/01/11/1644244.html 1.读出文件到字节数组中--这里编码2.把字节数组发送出去,如6楼3.将数据接入到字节数组4.将字节数组存成文件--这里解码,(加码解码要统一,对应)5.附部分代码,存文件。System.Windows.Forms.SaveFileDialog DialogSave = new System.Windows.Forms.SaveFileDialog();DialogSave.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";DialogSave.InitialDirectory = "c:";if (DialogSave.ShowDialog() == System.Windows.Forms.DialogResult.OK) { byte[] outBytes = null; outBytes = System.Text.Encoding.Default.GetBytes(TextBoxRecieve.Text); string FileName = DialogSave.FileName; // My.Computer.FileSystem.WriteAllBytes(FileName, outBytes, false); Stream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write); fs.Write(outBytes, 0, outBytes.Length); fs.Flush(); fs.Close(); // fs.Disppose() Interaction.MsgBox("数据保存到 " + FileName);} 说点原理吧,网络传输都是用二进制在传输。所以发送的时候必须以byte[],然后接收到后,再转换成对应的数据,这就是所谓的网络传输协议你可以看看C#里面所讲到的序列化,与反序列化,应该就可以进行实践了 //接收端代码 void tcp_OnReceived(byte[] message) { try { char[] charData; byte[] bData; // solve(message); string datagramtext = "HX7070\n0001"; string replyMessage = Encoding.Default.GetString(message); string str = replyMessage.Substring(11, 8); int oldcount = Convert.ToInt32(str,16) - 1; string rMessage = replyMessage.Substring(19); // string fileaddress=@"E:\TDDOWNLOAD\我爱你胜过你爱我1111.mp3"; string fileaddress = @"F:\13.56M各扇区控制块111.txt"; FileStream aFile = new FileStream(fileaddress, FileMode.Create,FileAccess.Write); datagramtext += tianchong(oldcount.ToString(), "0", 8, true); bData = Fun.GetPartBtye(message, 19, message.Length-19); aFile.Write(bData, 0, bData.Length); aFile.Flush(); aFile.Close(); //tcp.SendRequestMessage(datagramtext); this.AddInfo("reply message: " + replyMessage); } catch { } }//发送端代码string filename = @"F:\13.56M各扇区控制块.txt"; FileStream filestream = File.Open(filename, FileMode.Open); byte[] allbyte = new byte[filestream.Length]; filestream.Read(allbyte, 0, Convert.ToInt32(filestream.Length)); long FileLeng = filestream.Length / 400;//总包数 long FileYuLeng = filestream.Length % 400;//不足一包 if (FileYuLeng != 0) { FileLeng += 1; } for (int i = oldcount; i < FileLeng; i++) { long len = filestream.Length - i * 400; string datagramtext = "HX7070\n0001"; datagramtext += tianchong((FileLeng - i).ToString(), "0", 8, true); if (Convert.ToInt32(filestream.Length - i * 400) < 400) { byte[] bData = Fun.GetPartBtye(allbyte, i * 400, Convert.ToInt32(filestream.Length - i * 400)); //new byte[Convert.ToInt32(filestream.Length - i * 400)]; datagramtext += BitConverter.ToString(bData).Replace("-", ""); } else { byte[] bData = Fun.GetPartBtye(allbyte, i * 400, 400); datagramtext += BitConverter.ToString(bData).Replace("-", ""); } this.SendDatagram(datagramtext);//发送 //Thread.Sleep(100); } filestream.Flush(); filestream.Close(); Server(Client) -> Stream -> byte[] -> SOCKET ->byte[] -> Stream -> Client(Server) 有必要传输 字符串类型XML岂不更好 接收时,要将接到的字节,再转回字符串格式,就对上了。加上此条private List<byte> buffer = new List<byte>();private void ShowRecieveData(byte[] inbytes){ System.Text.StringBuilder instrs_temp = new System.Text.StringBuilder(); buffer.AddRange(inbytes); //缓存 instrs_temp.Append(System.Text.Encoding.Default.GetString(buffer.ToArray(), 0, buffer.Count));} FtpWebRequest reqFTP;FileStream outputStream = new FileStream(filePath, FileMode.OpenOrCreate); reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName)); reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; reqFTP.UseBinary = true; reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); reqFTP.ContentOffset = outputStream.Length;//断点续传 //21105512 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); Stream ftpStream = response.GetResponseStream(); long cl = response.ContentLength; int bufferSize = 20480;// int readCount; byte[] buffer = new byte[bufferSize]; readCount = ftpStream.Read(buffer, 0, bufferSize); sqlstr = "update downloading set DownState='1' where id=" + id;//把此文件的状态改为正在下载 try { access.DoSQL(SQLConn, sqlstr); } catch (Exception exx) { Fun.MsgShow(exx.Message, false); } //sqlstr = "insert into downloading(uploadpath,bytecount,addtime,states)values('" + fileName + "',0,date(),'0')"; //id =Convert.ToInt32( access.GetLastSQL(SQLConn, sqlstr)); outputStream.Position = outputStream.Length;//断点续传 while (readCount > 0) { outputStream.Write(buffer, 0, readCount); readCount = ftpStream.Read(buffer, 0, bufferSize); writeCount += readCount; } 两个dateTimePicker如何计算时差 想把几台服务器组成一个服务器群 GDI+的问题 求高手 用pop3怎么去判断邮件是否未读;怎么去获取邮件内容 请问大家见过这个类吗?实现的功能是:英文单词的各种形式变为其原形 winform的背景图片怎么随窗体大小变化 怎么实现类型的转换,具体不大好说,请看代码,谢谢!! Winfrom 做一个菜单 ASP.net(c#)中客户端不能看图片和flash,救命呀! 关于数据库的问题,请高手指点。 C# 继承类的问题 c#怎么封装快播(QVOD)
FileStream来读取和写入文件
Dictionary<string, ConnectionClient> dictConn = new Dictionary<string, ConnectionClient>(); //选择要发送的文件
private void btnChooseFile_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
txtFilePath.Text = ofd.FileName;
}
} //发送文件
private void btnSendFile_Click(object sender, EventArgs e)
{
//拿到下拉框中选中的客户端IPPORT
string key = cboClient.Text;
if (!string.IsNullOrEmpty(key))
{
dictConn[key].SendFile(txtFilePath.Text.Trim());
}
}
2.把字节数组发送出去,如6楼
3.将数据接入到字节数组
4.将字节数组存成文件--这里解码,(加码解码要统一,对应)
5.附部分代码,存文件。System.Windows.Forms.SaveFileDialog DialogSave = new System.Windows.Forms.SaveFileDialog();
DialogSave.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";
DialogSave.InitialDirectory = "c:";
if (DialogSave.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
byte[] outBytes = null;
outBytes = System.Text.Encoding.Default.GetBytes(TextBoxRecieve.Text);
string FileName = DialogSave.FileName;
// My.Computer.FileSystem.WriteAllBytes(FileName, outBytes, false);
Stream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write);
fs.Write(outBytes, 0, outBytes.Length);
fs.Flush();
fs.Close();
// fs.Disppose()
Interaction.MsgBox("数据保存到 " + FileName);
}
你可以看看C#里面所讲到的序列化,与反序列化,应该就可以进行实践了
//接收端代码
void tcp_OnReceived(byte[] message)
{
try
{
char[] charData;
byte[] bData;
// solve(message);
string datagramtext = "HX7070\n0001";
string replyMessage = Encoding.Default.GetString(message);
string str = replyMessage.Substring(11, 8);
int oldcount = Convert.ToInt32(str,16) - 1;
string rMessage = replyMessage.Substring(19);
// string fileaddress=@"E:\TDDOWNLOAD\我爱你胜过你爱我1111.mp3";
string fileaddress = @"F:\13.56M各扇区控制块111.txt";
FileStream aFile = new FileStream(fileaddress, FileMode.Create,FileAccess.Write);
datagramtext += tianchong(oldcount.ToString(), "0", 8, true);
bData = Fun.GetPartBtye(message, 19, message.Length-19);
aFile.Write(bData, 0, bData.Length);
aFile.Flush();
aFile.Close();
//tcp.SendRequestMessage(datagramtext);
this.AddInfo("reply message: " + replyMessage);
}
catch
{
}
}//发送端代码
string filename = @"F:\13.56M各扇区控制块.txt";
FileStream filestream = File.Open(filename, FileMode.Open);
byte[] allbyte = new byte[filestream.Length];
filestream.Read(allbyte, 0, Convert.ToInt32(filestream.Length));
long FileLeng = filestream.Length / 400;//总包数
long FileYuLeng = filestream.Length % 400;//不足一包
if (FileYuLeng != 0)
{
FileLeng += 1;
} for (int i = oldcount; i < FileLeng; i++)
{
long len = filestream.Length - i * 400;
string datagramtext = "HX7070\n0001";
datagramtext += tianchong((FileLeng - i).ToString(), "0", 8, true);
if (Convert.ToInt32(filestream.Length - i * 400) < 400)
{
byte[] bData = Fun.GetPartBtye(allbyte, i * 400, Convert.ToInt32(filestream.Length - i * 400)); //new byte[Convert.ToInt32(filestream.Length - i * 400)];
datagramtext += BitConverter.ToString(bData).Replace("-", "");
}
else
{
byte[] bData = Fun.GetPartBtye(allbyte, i * 400, 400);
datagramtext += BitConverter.ToString(bData).Replace("-", "");
}
this.SendDatagram(datagramtext);//发送
//Thread.Sleep(100);
}
filestream.Flush();
filestream.Close();
加上此条private List<byte> buffer = new List<byte>();
private void ShowRecieveData(byte[] inbytes)
{
System.Text.StringBuilder instrs_temp = new System.Text.StringBuilder();
buffer.AddRange(inbytes);
//缓存
instrs_temp.Append(System.Text.Encoding.Default.GetString(buffer.ToArray(), 0, buffer.Count));
}
FtpWebRequest reqFTP;
FileStream outputStream = new FileStream(filePath, FileMode.OpenOrCreate);
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName));
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.ContentOffset = outputStream.Length;//断点续传
//21105512
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
long cl = response.ContentLength;
int bufferSize = 20480;//
int readCount;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, 0, bufferSize);
sqlstr = "update downloading set DownState='1' where id=" + id;//把此文件的状态改为正在下载
try
{
access.DoSQL(SQLConn, sqlstr);
}
catch (Exception exx)
{
Fun.MsgShow(exx.Message, false);
}
//sqlstr = "insert into downloading(uploadpath,bytecount,addtime,states)values('" + fileName + "',0,date(),'0')";
//id =Convert.ToInt32( access.GetLastSQL(SQLConn, sqlstr));
outputStream.Position = outputStream.Length;//断点续传
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
writeCount += readCount;
}