.NET下使用Socket进行TCP传输时数据发送或接收不全

程序是一个基本的CS模型,客户端发送请求给服务器,服务器处理完毕以后把响应发回客户端。

1. 因为一次TCP连接只有一个请求或响应需要进行发送或接收,因此只想设计为发送请求之后服务器全部接收完毕即可,没有预先传一个包含待传的字节数的小型数据头。
2. 同时考虑到TCP流的特性,接收数据一次可能接收不完,故设计了循环多次接收。

客户端:先发送请求、再接收响应,关键部分代码如下:
MySocket.Connect( ipe );//连接到服务器
byte[] dataToEncrypt = Encoding.UTF8.GetBytes( message );
MySocket.Send( dataToEncrypt, dataToEncrypt.Length, SocketFlags.None );

byte[] recvBytes = new byte[ 102400 ];
int offset = 0;
int availableSize = 102400;
do {
int bytesAmount = MySocket.Receive( recvBytes, offset, availableSize, SocketFlags.None );
offset += bytesAmount;
availableSize -= bytesAmount;
} while ( MySocket.Available > 0 && availableSize > 0 );
string rcvMsg = Encoding.UTF8.GetString( recvBytes, 0, offset );

服务器:先接收请求,再发送响应,关键部分代码如下:
Socket tempSocket = (Socket) socket;
byte[] recvBytes = new byte[ 102400 ];
int offset = 0;
int availableSize = 102400;
tempSocket.ReceiveTimeout = 1000;
do {
int bytesAmount = tempSocket.Receive( recvBytes, offset, availableSize, SocketFlags.None );
offset += bytesAmount;
availableSize -= bytesAmount;
} while ( tempSocket.Available > 0 && availableSize > 0 );
string msg = Encoding.UTF8.GetString( recvBytes, 0, offset );

string decodedRequest = Coding.DecodeForTimes( msg, 5 );
string response = UndertakeWork.ScheduleRequest( decodedRequest ); //处理请求并返回结果
byte[] respondBytes = Encoding.UTF8.GetBytes( response );
tempSocket.Send( respondBytes, respondBytes.Length, SocketFlags.None );

tempSocket.Close();

具体情况是,用于缓存发送和接收请求的byte数组都是100K,保证能完全容纳程序的通信量。(当然每次发送也不是100K全发出去啦=_=)
由于对数据进行了多次DES加密,请求最后有38700 bytes左右,但是每次在服务器端接收只能收到18800 bytes左右。

弄一下午没办法了= = 求解决办法……谢谢了……
= =对了对了,还有问题是一旦我用VS进行调试时,一次次按F10检查,3W8 bytes数据就一定能接收完全,而一旦我取消了所有断点直接让程序跑的时候就只能接收到1W8……

唔,传输性能现在先不用管,只要能把数据弄全就行……
最新回答
赏怀

2024-10-15 04:28:27

试下引入多线程吧.

让服务器返回一个信息, 告诉客户端可以开始传数据之后, 客户端再传, 之前服务器端开一个线程来接收数据.

你还可以检测收到的1W8数据是3W8里面的哪一部分. 这个把发送的数据和接收的数据都保存成文件, 然后用WinHex打开就能很容易查找到. 这样才知道丢的是哪部分, 然后按情况处理.