c#使用Tcp协议的套接字流
我使用套接字流,协议Tcp用于服务器和客户端之间的连接 带有外部IP地址。 我的问题是我没有收到客户端发送的完整数据! I V试图shearch许多解决方案,我才知道,我要送Data Size
一则发送Actual Data
,这只是我做了什么,例如:c#使用Tcp协议的套接字流
string Data = ""; // my data here
string Crypted = crypt(Data); // just a method crypting string (work perfectly tested)
byte[] DataBytes = Encoding.Unicode.GetBytes(Crypted);
_ClientSocket.Send(BitConverter.GetBytes(DataBytes.Length),0,4,0);
_ClientSocket.Send(DataBytes,0,DataBytes.Length,0);
而对于接收Somethign就像是:
byte[] uffer;
byte[] BufferData;
int Size;
int Received;
uffer = new byte[4];
while (true)
{
uffer = new byte[4];
Size = _Client.Receive(uffer, 0, 4, 0);
if (Size > 0)
{
if (Size < _Client.ReceiveBufferSize)
{
BufferData = new byte[Size];
}
else
{
BufferData = new byte[_Client.ReceiveBufferSize];
}
Received = _Client.Receive(BufferData, 0, BufferData.Length, 0);
string Msg = Encoding.Unicode.GetString(buffer);
String Data = U.Decrypt(Msg);
}
但我仍然不接收数据,如果我做了,我没有收到它!
我想你会把第一次收到的结果与收到的值混合在一起。
后:
Size = _Client.Receive(uffer, 0, 4, 0);
Size
将通过API调用接收的字节数,只是你使用它的大小缓冲区为主要内容之后。
您需要将uffer
的内容转换为int
并使用它来调整下一次接收的缓冲区大小。 IE浏览器。你缺少的一个:
int messageSize = BitConverter.ToInt32(uffer, 0);
BufferData = new byte [Math.Min(messageSize, _Client.ReceiveBufferSize];
谢谢你的答案! ,但我仍然没有得到所有的结果,我有一个foreachloop发送数据例如进程中的Foreach进程将被发送到服务器,我只接收像4或5进程 –
@CruDy添加大量的日志记录到你的客户端和服务器,并通过。最不重要的事情可能就是你需要的线索。在[SO],我们只能继续处理你提出的问题。 – Richard
请编辑问题以使用实际显示问题的代码(即完整且最小的重新创建)。注1:我过去一直使用这种方法,它已经工作了; 2.请使用正常的.NET命名约定,[SO]语法突出显示效果会更好(这非常简单)。 – Richard
在'uffer'中的4个字节的字节,消息在'BufferData'中,但是你解码'buffer',这在代码片段的其他地方没有使用。 –
@Richard多数民众赞成我的代码其发行的代码。 –