C#< - > Java套接字通信

时间:2013-02-25 23:19:06

标签: 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应用程序不会发送答案。该应用程序是第三方软件,我无法更改它,但是我已经下载了一个反编译器并在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.我创建一个套接字并发送消息 我等待回应,没有任何反应 3.我手动关闭应用程序 - 它会导致套接字过期 4.突然,整个消息出现在Java应用程序的日志中。这意味着发生了异常,实际上有一些东西。

你能否指出我错误的位置?我相信this.is.readFully(正文)行不应该存在,但我不确定。也许我应该手动从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上执行此操作,我也无法在互联网上找到答案。

1 个答案:

答案 0 :(得分:0)

你能尝试刷新两个 StreamWriter(所以它将其缓冲区写入流对象)和你从NetworkStream得到的实际client.GetStream()(所以它发送一个数据包,尽管数据包尚未“满”)?

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

最有可能的是,你并没有冲洗所需要冲洗的所有东西。您是否尝试过与例如网络通信wireshark - 实际上是 out 的数据?如果没有,问题出在您的.NET代码中。