C#编程遇到一个奇怪问题
try{
clientSocket.Receive(inBuffer, 10, SocketFlags.None);
int backlen = Int32.Parse(Encoding.GetEncoding("GBK").GetString(inBuffer));
MessageBox.Show("接收字符长度为"+backlen.ToString());
clientSocket.Receive(inBuffer, 40, SocketFlags.None);
inBuffer = new Byte[20000];
List<byte> getbyte = new List<byte>();
while (clientSocket.Receive(inBuffer, backlen-40, SocketFlags.None) > 0)
{
getbyte.AddRange(inBuffer);
}
byte[] getbuff = getbyte.ToArray();
richTextBox2.Text = DecryptDES(getbuff, textBox3.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
代码如上,此段代码是要接受socket,数据流的规则是前10个字符为报文的整个长度(算上40个空格),后40个字符为空格,然后是数据包(密文)
以上代码的作用就是解密,但是很奇怪的是,
MessageBox.Show("接收字符长度为"+backlen.ToString());
这句代码影响着解密的成败,如果有这句,解密就会成功,如果没有,解密会成功一半,如下图
请高人解答,本人C#水平实在是没法解决这个问题 c# 解密 --------------------编程问答-------------------- MessageBox.Show("接收字符长度为"+backlen.ToString());
=>
System.Threading.Thread.Sleep(50); --------------------编程问答-------------------- 弹出对话框,给了更多时间让数据写入缓存,保证了数据的全部到达,不写,运行 很快,那没写完数据,就开始读取了,所以建议你不要直接读,还是要制定协议,确认数据是否接受完整 --------------------编程问答-------------------- 空的byte[]转成string 貌似是\0 会有很多\0 记得替换 --------------------编程问答-------------------- 2 # 应该说的对吧,是不是前后的编码不一致。转码错误。 --------------------编程问答-------------------- //读取服务器端返回来的消息
public static String getJsonFromServer()
{
byte[] data = null;
String backJson = null;
try
{
Debug.WriteLine(client.Connected + "连接否");
networkStream = client.GetStream();
int len = getJsonLen();
data = new byte[len];
int index = 0;
int readLength = 0;
while (index < len)
{
try
{
readLength = networkStream.Read(data, index, len - index);
}
catch (Exception ee)
{
Debug.WriteLine("Client getJsonFromServer()","read readLength is error "+ee.Message);
}
if (readLength > Number.COMPARE_ZERO)
{
index = index + readLength;
}
else
{
break;
}
}
networkStream.Flush();
backJson = Encoding.UTF8.GetString(data);
Debug.WriteLine(backJson);
}
catch (Exception ee)
{
Log.writeLog("Client getJsonFromServer()", App.Current.FindResource("Get_Json").ToString()+ee.Message);
}
return backJson;
}
//获得字符串的长度
private static int getJsonLen()
{
byte[] lengthdata = new byte[4];
for (int i = 0; i < 4; i++)
{
lengthdata[3 - i] = (byte)networkStream.ReadByte();
}
int len = BitConverter.ToInt32(lengthdata, 0);
if (len > Number.COMPARE_ZERO)
{
return len;
}
else
{
return 0;
}
} --------------------编程问答-------------------- 循环去读 直到读完 --------------------编程问答-------------------- while ( clientSocket.Available > 0 )
{
clientSocket.Receive(inBuffer, backlen-40, SocketFlags.None)
getbyte.AddRange(inBuffer);
}
补充:.NET技术 , C#