C#<-&燃气轮机;Java套接字通信

C#<-&燃气轮机;Java套接字通信,c#,java,.net,sockets,datainputstream,C#,Java,.net,Sockets,Datainputstream,我正在制作一个.NET应用程序,它应该通过套接字与Java应用程序通信。 以下是.NET代码: 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(cli

我正在制作一个.NET应用程序,它应该通过套接字与Java应用程序通信。 以下是.NET代码:

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);
}
试试看{

(this.is.available()如果Java应用程序来自第三方,则可能是您做错了什么。
DataInputStream.readFully(byte[])
函数会阻止应用程序,直到它读取了字节数组可以容纳的字节数,因此您拥有的代码片段来自读取操作

我还看到您使用
Socket.Send(byte[])
函数与Java应用程序进行通信,我建议您使用更高级别的东西,如StreamWriter或BinaryWriter,而不是像这样:

StreamWriter = new BinaryWriter(client.GetStream());
StreamWriter.Write(msg);
StreamWriter.Flush();
您是否可以尝试刷新
StreamWriter
(因此它将其缓冲区写入流对象)和从
client.GetStream()
获得的实际
NetworkStream
(因此它发送一个数据包,尽管数据包尚未“满”)


最有可能的是,您没有刷新所有需要刷新的内容。您是否尝试过查看与wireshark等的网络通信-数据是否真的出去了?如果没有,则问题出在您的.NET代码中。

我认为问题可能是假设在一端写入的字节会立即出现在另一端。强烈建议n:read你有没有试过在发送后调用
Flush
方法?我想如果你发送的数据块很小,你可能会反对Nagle的算法。如果另一个应用程序没有回答你的问题,很可能是你做错了什么。应用程序使用什么协议,你发送了有效的消息吗?你是怎么知道的决定要发送什么,您如何表示已完成发送?我已尝试使用WriteLine或Write and flushing来发送StreamWriter,但都没有帮助。但我尝试的是:for(int I=0;I<600;I++){sw.Write(“一些长随机字符串”);sw.Flush();}它会引起服务器的响应。我可能必须填满整个缓冲区或其他东西。这真的很奇怪。我用WriteLine或Write and flushing尝试了StreamWriter,之后也没有用。但是我尝试的是:for(int I=0;I<600;I++){sw.Write(“一些长随机字符串”);sw.Flush();}它会引起服务器的响应。我可能必须填满整个缓冲区或其他东西。这真的很奇怪。我尝试了rawcap,因为它发生在环回上,是的,数据实际上正在正确传输。我还尝试了NetworkStream刷新,但没有帮助。然后尝试编写一个自定义Java侦听器,看看是否这是可行的。我已经做到了。首先,我为服务器创建了一个Java客户端,它显示了相同的问题。然后,我创建了一个Java服务器,并连接了相同的.NET代码,它正在工作。所以,坏消息是,显然服务器有一个bug,很难解决。。。
StreamWriter = new BinaryWriter(client.GetStream());
StreamWriter.Write(msg);
StreamWriter.Flush();
NetworkStream ns = client.GetStream();
StreamWriter sw = new StreamWriter(ns);
StreamReader sr = new StreamReader(ns);
// ...
sw.Flush();
ns.Flush();