【问题标题】:Socket communication between Java and C# applicationJava 和 C# 应用程序之间的套接字通信
【发布时间】:2015-05-29 16:48:21
【问题描述】:

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


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


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


P/S:是的,套接字是双向的,在我当前的应用程序中,我可以将字符串数据从 C# 应用程序发送回 Java 应用程序,但前提是 Java 应用程序首先向 C# 应用程序发送字符串现在它正在等待来自 C# 应用程序的响应数据。


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

【问题讨论】:

  • 一旦建立连接,两端的服务套接字和活动连接套接字是相等且双向的。这意味着客户端和服务器不再真正相关。目前尚不清楚为什么您需要另一个套接字来发送字符串。或者为什么您想将服务器反转为客户端,反之亦然。
  • 我想在 cmets 中向您的 previous question 提及这一点。套接字是双向的。你不需要两个。
  • 抱歉,我犯了一个错误,我的意思是有时,C# 服务器应用程序需要向 Java 客户端应用程序发送一些数据,但这是不可能的,因为我的 Java 应用程序无法监听到那个端口了,因为它已经被 C# 应用程序占用了。
  • sockets 是双向的,所以现在我确定你不需要额外的sockets,因为你的评论是在提到这个事实之后出现的,这表明你可能不明白我们的意思。套接字可用于使用同一个套接字进行接收和发送。
  • 你需要在这里弄清楚你的概念,因为这听起来你有点困惑。考虑一个网络请求。浏览器连接到服务器并向服务器发送请求。服务器回复。全部在同一个 single 套接字连接上。没有打开新的套接字。不需要新的端口。连接后,客户端可以向服务器发送数据,服务器可以将数据发送回客户端。套接字允许读取和写入同一个套接字实例。一旦套接字连接上,客户端和服务器都可以读写。

标签: java c# sockets


【解决方案1】:

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

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

Java端:

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

C# 方面有点棘手,因为您需要考虑从 java 函数 writeUTF() 发送的前两个字节实际上是后面字符串的长度(以字节为单位)。您可以先获取这 2 个字节,然后将它们放入一个 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);

【讨论】:

  • 嗨,在我目前的情况下,我可以处理这个问题,因为我的 C# 应用程序是服务器,而我的 java 应用程序是客户端,我需要将数据从我的 c# 应用程序发送回 java 应用程序。
  • 一旦建立连接,客户端和服务器的概念就基本消失了。然后,您只有两个端点,每个端点都可以发送/接收。如果您想从 C# 应用程序向 Java 应用程序发送数据,只需获取 C# 套接字上的输出流并使用它。然后在 Java 端抓取输入流并从那里读取。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 2022-12-25
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
相关资源
最近更新 更多