C# <-> Java 套接字通信

标签 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(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/

相关文章:

c# - 如何避免从基类构造函数调用虚方法

java - 在Linux命令行中运行java文件(Storm helloWorld示例),包括库

java - appengine-web.xml - XML 错误验证

java - Spring Roo 项目找不到 org.springframework.roo.annotations :jar:1. 2.5.BUILD-SNAPSHOT

c# - 我应该如何使用 &str、Option 和 String 编码 Rust 函数并在 C# 中使用它?

.net - .NET消息框中的自定义按钮标题?

c# - 何时在 C# 中使用 Value 关键字

c# - 泛型方法以不同于泛型类型的方式处理 IEnumerable

c# - 需要一些关于排序字符串列表的想法

c# - 从不同程序集加载合并的 ResourceDictionary 失败