【发布时间】:2016-07-07 04:07:45
【问题描述】:
我和我的合作伙伴正在开展一个项目,我的合作伙伴正在使用 Pascal 进行开发并使用 Indy10 套接字进行网络,而我正在使用 C# 在 UWP 项目中进行开发。因此,对于网络,我必须使用 streamsocket 命名空间。
问题是,我的伙伴使用带有 -1 和 false 参数的 ReadStream 方法,这意味着接收流的长度是不确定的。因此,我必须从我的流中的数据(例如使用 DataWriter 类)继续发送数据本身计算的长度前缀(在这种情况下我使用 BitConverter.GetBytes 方法)。 但是 Indy10 套接字什么也没有收到。看起来它一直在等待数据包,或者我不知道。
有人遇到过这个问题吗?请帮忙,我们已经解决了大约两周的问题。我在 StackOverflow 中阅读了所有类似的问题,这是一篇关于使用框架、分隔符的博客。在 Indy Socket 源代码本身中搜索解决方案。 请帮忙!
更新 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 嗅探数据包,看看你发送不正确或他接收不正确。
-
我们无法调试我们看不到的代码,因为对代码的作用和行为方式的描述有些模糊。
-
你试过GitHub上的官方StreamSocket sample吗?此示例包含接收和发送功能。并且在发送数据的同时,还将内容的长度写为 UINT32 值在内容之前。您可以使用此示例来确定问题出在客户端还是服务器端。
标签: c# delphi uwp pascal indy10