我和我的合作伙伴正在开发一个项目,在这个项目中我的合作伙伴正在使用Pascal进行开发,并使用Indy10套接字进行联网,并且我正在使用C#在UWP项目中进行开发。因此,为了联网,我必须使用streamsocket命名空间。Indy10和System.Net.Sockets之间的网络联系
问题是,我的合作伙伴使用带有-1和false参数的ReadStream方法,这意味着接收流的长度是不确定的。因此,我必须从数据流中的数据(例如使用DataWriter类)发送计算的长度前缀(在这种情况下,我使用BitConverter.GetBytes方法)并继续处理数据本身。 但Indy10套接字不收到任何东西。它看起来像在等待数据包,或者我不知道。
有没有人遇到过这个问题?请帮助,我们一直在寻找解决方案大约两周。我已经阅读了StackOverflow中的所有类似问题,这是一篇关于使用帧,分隔符的博客。在Indy Socket源代码本身中搜索解决方案。 请帮忙!
UPDATE 1
C#代码。在这种情况下,我从WPF应用程序发送。逻辑,在UWP中流的使用方式几乎相同,只是使用StreamSocket和DataWriter。
TcpClient client = new TcpClient(hostTextBox.Text, int.Parse(portTextBox.Text));
Byte[] byteMessage = Encoding.Unicode.GetBytes(messageTextBox.Text);
Byte[] lenghtPrefix = BitConverter.GetBytes(byteMessage.Length);
Byte[] concatedData = new byte[lenghtPrefix.Length + byteMessage.Length];
lenghtPrefix.CopyTo(concatedData, 0);
byteMessage.CopyTo(concatedData, lenghtPrefix.Length);
NetworkStream stream = client.GetStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(concatedData);
writer.Flush();
stream.Close();
client.Close();
但我们已经尝试这种解决方案也:
Byte[] byteMessage = Encoding.Unicode.GetBytes(messageTextBox.Text);
Byte[] lenghtPrefix = BitConverter.GetBytes(byteMessage.Length);
Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
socket.Connect(hostTextBox.Text, int.Parse(portTextBox.Text));
socket.Send(lenghtPrefix, SocketFlags.None);
socket.SendBufferSize = byteMessage.Length;
socket.Send(byteMessage, SocketFlags.None);
socket.Close();
在服务器端Pascal代码中,等待流。以这种方式接收是非常重要的,因为软件的其他模块(也是使用Indy10在Pascal中编写的)以这种方式与服务器进行通信。
function Receive(const AContext: TIdContext): string;
var
Stream: TMemoryStream;
begin
try
Result := '';
Stream := TMemoryStream.Create;
if AContext.Connection.Connected then
AContext.Connection.IOHandler.ReadStream(Stream, -1, False);
finally
Result := UnPackStream(Stream);
Stream.Free;
end;
end;
尝试使用Wireshark嗅探数据包,看看如果您没有发送正确或他没有收到正确的消息。 – AlexDrenea
我们不能根据对它做什么以及如何表现的模糊描述来调试我们看不到的代码。 –
你在GitHub上试过了官方的[StreamSocket示例](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/StreamSocket)吗?此示例包含接收和发送功能。在发送数据时,它还会在内容之前将内容的长度写为UINT32的值。您可以使用此示例来确定问题出在您的客户端还是服务器端。 –