2

我正在制作一个 .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 应用程序不会发送答案。该应用程序是第 3 方软件,我无法更改它,但是我下载了反编译器并在 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(body) 线不应该在那里,但我不确定。也许我应该从 C# 代码手动发送 EOF,但我无法找出如何。

该代码的另一个小问题是,消息的前两个字符被删除,这就是为什么我在实际消息前面包含两个空格。

先感谢您。

编辑

所以我试图用一些随机数据填充套接字,我终于得到了答案:

for (int i = 0; i < 600; i++) 
{
    sw.Write("some long random string"); 
    sw.Flush(); 
}

不过,这不是一个好的解决方案,因为我发送的信息必须准确。然后我尝试在发送相关数据后关闭套接字,soc.Disconnect(false);这会导致 Java 应用程序的日志填充正确的调试信息。有没有办法将 EOL 发送到套接字,以便 Java 应用程序停止侦听并开始发送数据?谢谢你。

编辑 2 我试图创建一个 Java 客户端来连接到服务器,同样的事情也发生了。

然后,我创建了一个虚拟服务器来侦听与我正在连接的 Java 应用程序相同的端口,它的行为也与 Java 应用程序一样,并且正在工作。

现在我觉得我唯一的机会是将 EOT 或 EOF 命令发送到流,但我不知道如何在 .NET 上执行此操作,我也无法在互联网上找到答案。

4

2 回答 2

1

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

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

StreamWriter = new BinaryWriter(client.GetStream());
StreamWriter.Write(msg);
StreamWriter.Flush();
于 2013-02-26T00:44:39.937 回答
0

您可以尝试同时刷新因此StreamWriter它将其缓冲区写入流对象)和NetworkStream您从中获得的实际值client.GetStream()(因此它发送一个数据包,尽管数据包还没有“满”)?

NetworkStream ns = client.GetStream();
StreamWriter sw = new StreamWriter(ns);
StreamReader sr = new StreamReader(ns);
// ...
sw.Flush();
ns.Flush();

最有可能的是,您没有冲洗所有需要冲洗的东西。您是否尝试过使用例如 wireshark 来查看网络通信——数据是否真的出去?如果不是,则问题出在您的 .NET 代码中。

于 2013-02-26T09:32:30.827 回答