CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
(图)邪恶的韩国UMPC 使用 Java 编写数据库应用新规范
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

socket问题,我都要疯掉了,分不够再加,在线等

楼主lh1979(rocket)2006-12-01 13:38:39 在 .NET技术 / C# 提问

在局域网内部测试是好的,文件接受没有问题  
  银行和公积金是专线联的,但是到银行去测试的时候,  
  下了2个文件一个13m,一个1m,大文件不管怎么下都是全的,  
  小文件老是丢记录,如果是程序问题,局域网内部下都是好的啊,  
  服务端是别的公司在unix下开发的,客户端是c#,asp.net,  
   
  读包的流程:  
  包结构分为包头,包体,包体由文件名,文件长度,文件内容组成  
  我先接受包头,然后接受文件名,然后接受文件长度,再根据文件长度/1024来向缓存里面写,写满1024然后写文件,不够1024的定义实际长度的缓存,写到缓存里面后再写文件  
   
  哪位高手知道原因的告诉我,我要疯掉了 问题点数:100、回复次数:11Top

1 楼JasonHeung(拥有一切不过就这样笑着哭)回复于 2006-12-01 13:42:53 得分 30

包结构分为包头,包体,包体由文件名,文件长度,文件内容组成  
  我先接受包头,然后接受文件名,然后接受文件长度,再根据文件长度/1024来向缓存里面写,写满1024然后写文件,不够1024的定义实际长度的缓存,写到缓存里面后再写文件.  
  考虑:  
  文件长度不够1024.  
  文件长度最后还有剩余字节;  
  文件写完后,接受缓冲区内还有字节,其长度可能够一个包头或者不够一个包头的数据的缓存处理。Top

2 楼bigrongshu(Life is full of possibilities)回复于 2006-12-01 13:43:13 得分 30

Socket通讯问题局域网内好好的,外面问题多多,很正常  
   
  你的问题很难说清楚,可能和服务器端程序的一些Tcp/Ip设置有关,也可能和你的程序有关Top

3 楼lh1979(rocket)回复于 2006-12-01 13:43:40 得分 0

包头  
  public     class   sendrecord  
  {  
   
  public   char   []   msg=new   char[4];//报文头长度0  
  public   char   []   reqflag=new   char[2];//请求标志4  
  public   char   []   reccode=new   char[2];//应答码6  
  public   char   []   recmsg=new   char[30];//应答信息36  
  public   char   []   svrcode=new   char[4];//服务代码40  
  public   char   []   bankcode=new   char[3];//银行代码43  
  public   char   []   bussdate=new   char[10];//业务日期53  
  public   char   []   fileflag=new   char[2];//文件传输标志55  
  public   char   []   filekind=new   char[1];//传输方式56  
  public   char   []   filecount=new   char[2];//文件传输个数58  
  public   char   []   filename=new   char[100];//文件名称60  
   
   
  };  
  Top

4 楼lh1979(rocket)回复于 2006-12-01 13:44:34 得分 0

代码:  
  int   initlen=1024;  
  sendrecord   sr=new   sendrecord();  
  sys.baseinfoTB.setarray(sr.msg,"156",0,'   ');  
  sys.baseinfoTB.setarray(sr.reqflag,"RQ",0,'   ');  
  sys.baseinfoTB.setarray(sr.reccode,"",0,'   ');  
  sys.baseinfoTB.setarray(sr.recmsg,"",0,'   ');  
  sys.baseinfoTB.setarray(sr.svrcode,"0000",0,'   ');  
  sys.baseinfoTB.setarray(sr.bankcode,ua.get_bank(),0,'   ');  
  sys.baseinfoTB.setarray(sr.bussdate,newdate,0,'   ');  
  sys.baseinfoTB.setarray(sr.fileflag,"DN",0,'   ');  
  sys.baseinfoTB.setarray(sr.filekind,"1",0,'   ');  
  sys.baseinfoTB.setarray(sr.filecount,scount,0,'   ');  
  int   kkk=filename.Length;  
  sys.baseinfoTB.setarray(sr.filename,filename,1,'   ');  
   
   
   
  char   []   send=new   char[160];  
  for   (int   i=0;i<=3;i++)  
  {send[i]=sr.msg[i];}  
   
  for   (int   i=0;i<=1;i++)  
  {send[i+4]=sr.reqflag[i];}  
   
  for   (int   i=0;i<=1;i++)  
  {send[i+6]=sr.reccode[i];}  
   
  for   (int   i=0;i<=29;i++)  
  {send[i+8]=sr.recmsg[i];}  
   
  for   (int   i=0;i<=3;i++)  
  {send[i+38]=sr.svrcode[i];}  
   
  for   (int   i=0;i<=2;i++)  
  {send[i+42]=sr.bankcode[i];}  
   
  for   (int   i=0;i<=9;i++)  
  {send[i+45]=sr.bussdate[i];}  
   
  for   (int   i=0;i<=1;i++)  
  {send[i+55]=sr.fileflag[i];}  
   
  for   (int   i=0;i<=0;i++)  
  {send[i+57]=sr.filekind[i];}  
   
  for   (int   i=0;i<=1;i++)  
  {send[i+58]=sr.filecount[i];}  
   
  for   (int   i=0;i<=99;i++)  
  {send[i+60]=sr.filename[i];}  
   
  Byte[]   bytes=new   Byte[160];  
   
   
  Byte[]   bfile=new   Byte[30];  
  Byte[]   bfilesize=new   Byte[8];  
   
   
  Encoding.ASCII.GetBytes(send,0,send.Length,bytes,0);  
   
                           
   
  sys.CommunClass   cc=new   sys.CommunClass();  
   
   
  Socket   socket=cc.ConnectServer(ip,Convert.ToInt32(port));  
   
   
  try  
  {  
  socket.Send(bytes,0,bytes.Length,SocketFlags.None);  
  }  
  catch  
  {  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"通讯失败,请检查!");  
  return;  
  }  
   
  int   rec=0,filecount=0,ilen=0,k=0;  
  string   sfilename="";  
  /////////////////////////////////////////////////////////  
   
  NetworkStream   ns=new   NetworkStream(socket,FileAccess.Read);  
  try  
  {  
  rec=ns.Read(bytes,0,bytes.Length);  
  }  
  catch  
  {  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"通讯失败,请检查!");  
  return;  
  }  
  string   rev=Encoding.ASCII.GetString(bytes,0,bytes.Length);  
   
  sr.msg=rev.ToCharArray(0,4);  
  sr.reqflag=rev.ToCharArray(4,2);  
  sr.reccode=rev.ToCharArray(6,2);  
  sr.recmsg=rev.ToCharArray(8,30);  
  sr.svrcode=rev.ToCharArray(38,4);  
  sr.bankcode=rev.ToCharArray(42,3);  
  sr.bussdate=rev.ToCharArray(45,10);  
  sr.fileflag=rev.ToCharArray(55,2);  
  sr.filekind=rev.ToCharArray(57,1);  
  sr.filecount=rev.ToCharArray(58,2);  
  sr.filename=rev.ToCharArray(60,100);  
   
   
   
   
  if   (sys.baseinfoTB.getstring(sr.reccode)=="00")//成功  
  {  
  filecount=Int32.Parse(sys.baseinfoTB.getstring(sr.filecount));  
  while   (filecount!=0)  
  {  
  k=0;  
  try  
  {  
  rec=ns.Read(bfile,0,bfile.Length);  
  }  
  catch  
  {  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"通讯失败,请检查!");  
  return;  
  }  
  sfilename=Encoding.ASCII.GetString(bfile,0,bfile.Length).Trim();  
   
  FileInfo   fi=new   FileInfo(@path+sfilename);  
  try  
  {  
  if   (fi.Exists)  
  {  
  fi.Delete();  
  }  
  }  
  catch  
  {  
  sys.MessageBox.Show(this,"删除文件错误!");  
  }  
   
  try  
  {  
  rec=ns.Read(bfilesize,0,bfilesize.Length);  
  }  
  catch  
  {  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"通讯失败,请检查!");  
  return;  
  }Top

5 楼lh1979(rocket)回复于 2006-12-01 13:44:59 得分 0

接上面:  
  string   slen=Encoding.ASCII.GetString(bfilesize,0,bfilesize.Length);  
  try  
  {  
  ilen=Convert.ToInt32(slen);  
  }  
  catch  
  {  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"下载文件错误,请重新下载!");  
  return;  
  }  
  if   (ilen%initlen==0)  
  {  
  Byte[]   buff=new   Byte[initlen];  
  for   (int   i=0;i<ilen/initlen;i++)  
  {  
  FileStream   fs=new   FileStream(@path+sfilename,FileMode.Append,FileAccess.Write);  
  try  
  {  
  rec=ns.Read(buff,0,buff.Length);  
  }  
  catch  
  {  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"通讯失败,请检查!");  
  return;  
  }  
  try  
  {  
   
  fs.Write(buff,0,buff.Length);  
  k+=initlen;  
  }  
  catch(IOException   ee)  
  {  
  k=0;  
  fs.Close();  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"文件写入错误"+ee.Message);  
  return;  
  }  
  finally  
  {  
  fs.Close();  
  }  
  }  
  if   (k!=ilen)  
  {  
  k=0;  
   
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"文件下载不全,请重新下载!");  
  return;  
  }  
  }  
  else  
  {  
  if   (ilen/initlen==0)  
  {  
  Byte[]   buff=new   Byte[ilen];  
  try  
  {  
  rec=ns.Read(buff,0,buff.Length);  
  }  
  catch  
  {  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"通讯失败,请检查!");  
  return;  
  }  
  FileStream   fs=new   FileStream(@path+sfilename,FileMode.Create,FileAccess.Write);  
  try  
  {  
  rec=ns.Read(buff,0,buff.Length);  
  }  
  catch  
  {  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"通讯失败,请检查!");  
  return;  
  }  
  try  
  {  
   
  fs.Write(buff,0,buff.Length);  
  }  
  catch(IOException   ee)  
  {  
  fs.Close();  
  k=0;  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"文件写入错误"+ee.Message);  
  return;  
  }  
  finally  
  {  
  fs.Close();  
  }  
   
  }  
  else  
  {  
  Byte[]   buff=new   Byte[initlen];  
  for   (int   i=0;i<ilen/initlen;i++)  
  {  
   
  FileStream   fs=new   FileStream(@path+sfilename,FileMode.Append,FileAccess.Write);  
  try  
  {  
  rec=ns.Read(buff,0,buff.Length);  
  }  
  catch  
  {  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"通讯失败,请检查!");  
  return;  
  }  
  k+=initlen;  
  try  
  {  
   
  fs.Write(buff,0,buff.Length);  
  }  
  catch(IOException   ee)  
  {  
  fs.Close();  
  k=0;  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"文件写入错误"+ee.Message);  
  return;  
  }  
  finally  
  {  
  fs.Close();  
  }  
  }  
  Byte[]   buffs=new   Byte[ilen%initlen];  
  k+=ilen%initlen;  
  try  
  {  
  rec=ns.Read(buffs,0,buffs.Length);  
  }  
  catch  
  {  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"通讯失败,请检查!");  
  return;  
  }  
  FileStream   fss=new   FileStream(@path+sfilename,FileMode.Append,FileAccess.Write);  
   
  try  
  {  
   
  fss.Write(buffs,0,buffs.Length);  
  }  
  catch(IOException   ee)  
  {  
  fss.Close();  
  k=0;  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"文件写入错误"+ee.Message);  
  return;  
  }  
  finally  
  {  
  fss.Close();  
  }  
  if   (k!=ilen)  
  {  
  k=0;  
   
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"文件下载不全,请重新下载!");  
  return;  
  }  
  }  
   
  }  
   
   
  filecount--;  
   
  }    
   
   
   
   
  }  
  else   if   (sys.baseinfoTB.getstring(sr.reccode)=="01")  
  {  
  sys.MessageBox.Show(this,"请求下载的文件不存在!");  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  return;  
  }  
  else   if   (sys.baseinfoTB.getstring(sr.reccode)=="02")  
  {  
  sys.MessageBox.Show(this,"文件已经存在!");  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  return;  
  }  
  else    
  {  
  sys.MessageBox.Show(this,"其他错误!");  
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  return;  
  }  
   
   
   
  socket.Shutdown(SocketShutdown.Both);  
  socket.Close();  
  sys.MessageBox.Show(this,"文件下载成功!");Top

6 楼free_wang()回复于 2006-12-01 14:05:53 得分 0

up................................  
   
  Top

7 楼myrocket()回复于 2006-12-01 14:06:52 得分 0

我都是有多大的长度就设置多大的缓存啊,包体的长度都是固定的Top

8 楼myrocket()回复于 2006-12-01 14:08:11 得分 0

这个还和asp.net有关啊Top

9 楼zuo_hy(2007--my year)回复于 2006-12-01 14:11:28 得分 10

我是新手,幫你鼎。Top

10 楼NOX2006()回复于 2006-12-01 14:14:20 得分 30

还是你的包的问题  
   
  我是采用XML再BASE64编码发出去的,大小文件通吃  
   
  XML标记里面记录包的次序\实际大小等  
   
  SOCKET通讯里面,会给你的包加你不希望加的内容的(一般是补最后几位),所以需要自己掌握好数据包的大小  
   
  我当时也为这个苦恼了好一阵,程序没错,但是接收到的数据就是不准确,后面分析接收到的文件内容,并`逐个分析接收到的包,才解决掉  
  Top

11 楼myrocket()回复于 2006-12-01 14:15:02 得分 0

我也是新手,csdn这个只能连续发3遍,我只好又重新注册一个号Top

相关问题

关键词

得分解答快速导航

  • 帖主:lh1979
  • JasonHeung
  • bigrongshu
  • zuo_hy
  • NOX2006

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo