我和我的合作伙伴正在開發一個項目,在這個項目中我的合作伙伴正在使用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的值。您可以使用此示例來確定問題出在您的客戶端還是服務器端。 –