我正在制作一个 .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 上执行此操作,我也无法在互联网上找到答案。