gpt4 book ai didi

C# <-> Java 套接字通信

转载 作者:行者123 更新时间:2023-11-30 11:35:31 25 4
gpt4 key购买 nike

我正在制作一个 .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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com