████████【网络编程】文件传输线程与内存,恭请思归,孟子E章,Herry和海波三位大侠及其他星级及角级既无级高手入内!

csdn8008 2003-10-20 08:41:10
关于文件传输的重要问题!解决散分.

三个问题如下:
1、读写。
传输时用
StreamReader rd = new StreamReader(strm);
byte[] mb = new byte[fbytes];
FileStream fstrm = new FileStream(FileName,FileMode.OpenOrCreate,FileAccess.Write);
fstrm.Write(mby,0,startmbyte);
A问题:
这样,将文件全部读入到内存,如果是大文件,就会死机。那如果偶尔要传输大文件怎么办呢(一般是小文件)?

2、速度。
发送接收文件都用新线程
Thread th = new Thread(new ThreadStart(sendfile));
th.Start();
B问题:
但如果文件稍大,传输过程还是会很慢很慢,怎么办呢?能不能将任务分解成几个线程同时发送或接收?
C问题:
具体又怎么实现呢?
...全文
40 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
azev 2003-12-22
  • 打赏
  • 举报
回复
fav
csdn8008 2003-10-21
  • 打赏
  • 举报
回复
多谢 gujunyan(ivy阿亮) ,你的方法用了,好。
不过,内存消耗少了,但出现文件传不全的问题,
7468K的文件只能接收到1883K,这是为什么呢?是不是哪儿有问题了,代码贴出来,请指正。
帮忙!谢谢!

发送文件部分代码
byte[] b=new byte[1024];
int bytes;
try
{
bytes=fileReader.Read(b,0,1024);
while(bytes>0)
{
//从文件读入
fileReader.Read(b,0,bytes);
ns.Write(b,0,bytes);
bytes=fileReader.Read(b,0,1024);
}
}


接收文件部分代码
byte[] b=new byte[1024];
int count;
try
{
count=nsl.Read(b,0,1024);
while(count>0)
{
nsl.Read(b,0,count);
fileWriter.Write(b,0,count);
count=nsl.Read(b,0,1024);
}
}
顾君彦 2003-10-21
  • 打赏
  • 举报
回复
我那段程序是做socket代理的,就是经常说的端口映射。
从这个流里读数据
count=_InStream.Read(b,0,1024);
写到这个流里
_OutStream.Write(b,0,count);
并同时写到文件里。
FileInStream.Write(b,0,count);
我只是摘一段代码出来,希望你能从中理解我说的读多少写多少。
不要一下子开一个很大的byte数组后读,很吃内存,容易受到攻击的

csdn8008 2003-10-21
  • 打赏
  • 举报
回复
byte[] b=new byte[1];
ajex 2003-10-21
  • 打赏
  • 举报
回复
你可以自定义缓冲区的大小呀.不会把内存都用光的.
csdn8008 2003-10-21
  • 打赏
  • 举报
回复
FileInStream.Write(b,0,count);
_OutStream.Write(b,0,count);

什么???
顾君彦 2003-10-20
  • 打赏
  • 举报
回复

传文件最好边读边写,否则,你不怕别人攻击你的服务器啊,玩命的给你传,内存不久就用光了。
给你一段代码,我是那样做的。
通信时的一段代码,边读边写。
只能参考:
byte[] b=new byte[1024];
int count;
try
{
count=_InStream.Read(b,0,1024);
while(count>0)
{
FileInStream.Write(b,0,count);
_OutStream.Write(b,0,count);
count=_InStream.Read(b,0,1024);
}
}
catch
{

}
finally
{
FileInStream.Close();
_InStream.Close();
_OutStream.Close();
}
维她奶 2003-10-20
  • 打赏
  • 举报
回复
up
ASP.NET程序中常用的三十三种代码 1. 打开新的窗口并传送参数:   传送参数: response.write("window.open(’*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"’)")   接收参数: string a = Request.QueryString("id"); string b = Request.QueryString("id1");   2.为按钮添加对话框 Button1.Attributes.Add("onclick","return confirm(’确认?’)"); button.attributes.add("onclick","if(confirm(’are you sure...?’)){return true;}else{return false;}")   3.删除表格选定记录 int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex]; string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString()   4.删除表格记录警告 private void DataGrid_ItemCreated(Object sender,DataGridItemEventArgs e) {  switch(e.Item.ItemType)  {   case ListItemType.Item :   case ListItemType.AlternatingItem :   case ListItemType.EditItem:    TableCell myTableCell;    myTableCell = e.Item.Cells[14];    LinkButton myDeleteButton ;    myDeleteButton = (LinkButton)myTableCell.Controls[0];    myDeleteButton.Attributes.Add("onclick","return confirm(’您是否确定要删除这条信息’);");    break;   default:    break;  } }   5.点击表格行链接另一页 private void grdCustomer_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) {  //点击表格打开  if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)   e.Item.Attributes.Add("onclick","window.open(’Default.aspx?id=" + e.Item.Cells[0].Text + "’);"); }   双击表格连接到另一页   在itemDataBind事件中 if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {  string OrderItemID =e.item.cells[1].Text;  ...  e.item.Attributes.Add("ondblclick", "location.href=’../ShippedGrid.aspx?id=" + OrderItemID + "’"); }   双击表格打开新一页 if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {  string OrderItemID =e.item.cells[1].Text;  ...  e.item.Attributes.Add("ondblclick", "open(’../ShippedGrid.aspx?id=" + OrderItemID + "’)"); }   ★特别注意:【?id=】 处不能为 【?id =】   6.表格超连接列传递参数   后台代码 protected void CheckAll_CheckedChanged(object sender, System.EventArgs e) {  //改变列的选定,实现全选或全不选。  CheckBox chkExport ;  if( CheckAll.Checked)  {   foreach(DataGridItem oDataGridItem in MyDataGrid.Items)   {    chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");    chkExport.Checked = true;   }  }  else  {   foreach(DataGridItem oDataGridItem in MyDataGrid.Items)   {    chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");    chkExport.Checked = false;   }  } }   17.数字格式化   【的结果是500.0000,怎样格式化为500.00?】 int i=123456; string s=i.ToString("###,###.00");   18.日期格式化   【aspx页面内:   显示为: 2004-8-11 19:44:28   我只想要:2004-8-11 】   应该如何改?   【格式化日期】   取出来,一般是 object((DateTime)objectFromDB).ToString("yyyy-MM-dd");   【日期的验证表达式】   A.以下正确的输入格式: [2004-2-29], [2004-02-29 10:29:39 pm], [2004/12/31] ^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|([1-2][0-9])))))|(\d{2}(([02468][1235679])|([13579][01345789]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\s(((0?[1-9])|(1[0-2]))\:([0-5][0-9])((\s)|(\:([0-5][0-9])\s))([AM|PM|am|pm]{2,2})))?$   B.以下正确的输入格式:[0001-12-31], [9999 09 30], [2002/03/03] ^\d{4}[\-\/\s]?((((0[13578])|(1[02]))[\-\/\s]?(([0-2][0-9])|(3[01])))|(((0[469])|(11))[\-\/\s]?(([0-2][0-9])|(30)))|(02[\-\/\s]?[0-2][0-9]))$   【大小写转换】 HttpUtility.HtmlEncode(string); HttpUtility.HtmlDecode(string)   19.如何设定全局变量   Global.asax中   Application_Start()事件中   添加Application[属性名] = xxx;   就是你的全局变量   20.怎样作到HyperLinkColumn生成的连接后,点击连接,打开新窗口?   HyperLinkColumn有个属性Target,将器值设置成"_blank"即可.(Target="_blank")   【ASPNETMENU】点击菜单项弹出新窗口   在你的menuData.xml文件的菜单项中加入URLTarget="_blank",如: ......   最好将你的aspnetmenu升级到1.2版   21.读取DataGrid控件TextBox值 foreach(DataGrid dgi in yourDataGrid.Items) {  TextBox tb = (TextBox)dgi.FindControl("yourTextBoxId");  tb.Text.... }   23.在DataGrid中有3个模板列包含Textbox分别为 DG_ShuLiang (数量) DG_DanJian(单价) DG_JinE (金额)分别在5.6.7列,要求在录入数量及单价的时候自动算出金额即:数量*单价=金额还要求录入时限制为 数值型.我如何用客户端脚本实现这个功能?   〖思归 function DoCal() {  var e = event.srcElement;  var row = e.parentNode.parentNode;  var txts = row.all.tags("INPUT");  if (!txts.length || txts.length < 3)   return;  var q = txts[txts.length-3].value;  var p = txts[txts.length-2].value;  if (isNaN(q) || isNaN(p))   return;  q = parseInt(q);  p = parseFloat(p);  txts[txts.length-1].value = (q * p).toFixed(2); }   24.datagrid选定比较底下的行时,为什么总是刷新一下,然后就滚动到了最上面,刚才选定的行因屏幕的关系就看不到了。 page_load page.smartNavigation=true   25.在Datagrid中修改数据,当点击编辑键时,数据出现在文本框中,怎么控制文本框的大小 ? private void DataGrid1_ItemDataBound(obj sender,DataGridItemEventArgs e) {  for(int i=0;i

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧