我正在制作一个 .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);
}
"is"在这种情况下是一个 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 上执行此操作,而且我也无法在互联网上找到答案。
最佳答案
如果 Java 应用程序来自第三方,很可能是您做错了什么。 DataInputStream.readFully(byte[])
函数会阻止应用程序,直到它读取了字节数组可以容纳的字节数,因此您拥有的代码片段来自读取操作。
我还看到您使用 Socket.Send(byte[])
函数与 Java 应用程序通信,我建议您使用更高级别的东西,如 StreamWriter 或 BinaryWriter,像这样的更多:
StreamWriter = new BinaryWriter(client.GetStream());
StreamWriter.Write(msg);
StreamWriter.Flush();
关于C# <-> Java 套接字通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15078417/