我正在製作一個.NET應用程序,它應該通過套接字與Java應用程序進行通信。 這裏是.NET代碼:C#<-> Java套接字通信
string str = " MSG1234";
TcpClient client = new TcpClient();
client.Connect("127.0.0.1", 8080);
byte[] msg = Encoding.UTF8.GetBytes(str);
client.Client.Send(msg);
StreamWriter sw = new StreamWriter(client.GetStream());
StreamReader sr = new StreamReader(client.GetStream());
while (true)
{
Console.WriteLine(sr.Read());
}
的問題是,Java應用程序將不會發送答案。該應用程序是一個第三方的軟件,我不能改變它,但是我已經下載了一個反編譯器,發現在Java類相關的代碼:
try {
while (this.is.available() <= 0);
body = new byte[this.is.available()];
this.is.readFully(body);
System.out.println("Message received");
} catch (Exception e) {
System.out.println("Error: " + body);
}
「是」,在這種情況下是DataInputStream類。這是發生了什麼: 1.我創建一個套接字和發送郵件 2.我等待迴應,什麼都不會發生 3.我手動關閉應用程序 - 它會導致插座到期 4.突然出現在整個郵件Java應用程序的日誌。這意味着發生了異常,並且實際上有一些東西在體內。
你能指出我錯誤的地方嗎?我相信this.is.readFully(身體)線不應該在那裏,但我不確定。也許我應該手動從C#代碼發送一個EOF,但我無法知道如何。
另外,與代碼小問題是,該消息的前兩個字符被剝奪,這就是爲什麼我已經包括在實際消息的前面的兩個空間。
預先感謝您。
編輯
所以我試圖填補一些隨機數據插口和我終於得到了答案:
for (int i = 0; i < 600; i++)
{
sw.Write("some long random string");
sw.Flush();
}
這不是一個很好的解決方案,但因爲消息我發送必須是確切的。 然後我試圖通過soc.Disconnect(false);
發送相關數據後關閉套接字,這會導致Java應用程序的日誌填充正確的調試信息。 有什麼方法可以將EOL發送到套接字,這樣Java應用程序就會停止監聽並開始發送數據? 謝謝。
EDIT 2 我試圖創建一個Java客戶端連接到服務器,同樣的事情發生了。
然後我創建了一個虛擬服務器監聽同一端口的Java應用程序,我也連接上,它也表現方式與Java應用程序應該和它的工作。
現在我覺得我唯一的機會是發送EOT或EOF命令到流中,但我不知道如何在.NET上執行它,我也無法在Internet上找到答案。
我認爲這個問題可能是假設在一面上寫入的一個字節會瞬間出現在另一面。強烈建議:閱讀[Beej的套接字編程指南](http://beejjus.com/guide/bgnet/output/html/multipage/) – paulsm4 2013-02-25 23:22:40
您是否嘗試過在發送後調用
Flush
方法?如果您發送的數據塊很小,我認爲您可能會與Nagle的算法發生衝突。 – 2013-02-25 23:25:33如果其他應用程序不回答您的問題,那麼您可能會做錯某些事情。應用程序使用什麼協議,您是否發送了有效的消息?你是如何決定發送什麼的,你如何表示你已經發送了? – CodeCaster 2013-02-25 23:40:50