Java和C#应用程序之间的套接字通信

我有02个应用程序,一个用java编写,另一个用C#编写。 我需要在它们之间交换数据(字符串),因此我使用套接字连接。

目前,C#应用程序充当服务器,Java应用程序充当客户端。 C#应用程序将持续侦听端口“7777”,Java应用程序将启动一个套接字“localhost:7777”并使用该套接字将数据发送到C#服务器。 我不关闭它们之间的连接,因为我需要经常交换数据。

在我的C#服务器应用程序有时需要将一些字符串发送到Java客户端应用程序之前,一切都很好。 我想使用另一个端口使我的java应用程序成为服务器,C#应用程序也将成为客户端。 但我觉得这不是一个好的解决方案。

P / S:是的,socket是双向的,在我当前的应用程序中,我可以将来自我的C#应用​​程序的字符串数据发送回Java应用程序,但只有当Java应用程序首先将字符串发送到C#应用程序并且现在它正在等待时来自C#应用程序的响应数据。

因此,我想问一下是否还有其他更好的解决方案? 如果我们总共只使用1个端口吗? 非常感谢你。

您的套接字可以双向工作(双向),因此您无需创建另一个套接字。 您可以在连接的两端获取套接字的输出流和输入流,并使用它们进行发送/接收。

要发送字符串,最简单的方法可能是使用DataOutputStream,因为您可以使用简单的函数编写UTF-8字符串。

Java方面:

String blah = "hey"; DataOutputStream dataOs = new DataOutputStream(socket.getOutputStream()); dataOs.writeUTF(blah); 

C#端略显棘手,因为您需要考虑从java函数writeUTF()发送的前两个字节实际上是后面的字符串的长度(以字节为单位)这一事实。 您可以先获取这两个字节,然后将它们放入一个int中,随着时间的推移移动这些位。 然后,当您从套接字请求字符串时,可以使用该int作为缓冲区的大小。 应该看起来像这样。

C#方:

 int length = 0; byte[] sizeBuffer = new byte[2]; socket.Receive(sizeBuffer); for (int i = 0; i < sizeBuffer.Length; i += 1) { length = length << 8; length += sizeBuffer[i]; } byte[] stringBuffer = new byte[length]; socket.Receive(stringBuffer); string myString = Encoding.UTF8.GetString(stringBuffer, 0, stringBuffer.Length);