我有02个应用程序,一个用java编写,另一个用C#编写。我需要在它们之间交换数据(字符串),因此我使用套接字连接。
目前,C#应用程序充当服务器,Java应用程序充当客户端。 C#应用程序将持续侦听端口“7777”,Java应用程序将启动一个套接字“localhost:7777”并使用该套接字将数据发送到C#服务器。我不关闭它们之间的连接,因为我需要经常交换数据。
在我的C#服务器应用程序有时需要将一些字符串发送到Java客户端应用程序之前,一切都很好。我想使用另一个端口使我的java应用程序成为服务器,C#应用程序也将成为客户端。但我觉得这不是一个好的解决方案。
因此我想问一下是否还有其他更好的解决方案?如果我们总共只使用1个端口吗?非常感谢你。
答案 0 :(得分:2)
您的套接字可以双向工作(双向),因此您不需要创建另一个套接字。您可以在连接的两端获取套接字的输出流和输入流,并使用它们进行发送/接收。
要发送字符串,最简单的方法可能是使用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);