socket问题,我都要疯掉了,分不够再加,在线等
在局域网内部测试是好的,文件接受没有问题
银行和公积金是专线联的,但是到银行去测试的时候,
下了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





