程序是一个基本的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…… 唔,传输性能现在先不用管,只要能把数据弄全就行……
试下引入多线程吧. 让服务器返回一个信息, 告诉客户端可以开始传数据之后, 客户端再传, 之前服务器端开一个线程来接收数据. 你还可以检测收到的1W8数据是3W8里面的哪一部分. 这个把发送的数据和接收的数据都保存成文件, 然后用WinHex打开就能很容易查找到. 这样才知道丢的是哪部分, 然后按情况处理.