Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java与C#应用程序之间的套接字通信_Java_C#_Sockets - Fatal编程技术网

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

Java与C#应用程序之间的套接字通信,java,c#,sockets,Java,C#,Sockets,我有两个应用程序,一个是用java编写的,另一个是用C#编写的。我需要在它们之间交换数据(字符串),因此我使用套接字连接 目前,C#应用程序充当服务器,java应用程序充当客户端。C#应用程序将持续监听端口“7777”,Java应用程序将创建一个指向“localhost:7777”的套接字作为启动,并使用该套接字向C#服务器发送数据。我不关闭它们之间的连接,因为我需要频繁交换数据 一切都很好,直到我的C#服务器应用程序有时需要向Java客户端应用程序发送一些字符串。我考虑使用另一个端口使java

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


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


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


p/S:是的,套接字是双向的,在我当前的应用程序中,我可以将字符串数据从我的C#应用程序发送回Java应用程序,但只有当Java应用程序第一次向C#应用程序发送字符串时,它才等待C#应用程序的响应数据



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

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

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

Java方面:

String blah = "hey";
DataOutputStream dataOs = new DataOutputStream(socket.getOutputStream());
dataOs.writeUTF(blah);
C#端稍微复杂一些,因为您需要考虑以下事实:从java函数writeUTF()发送的前两个字节实际上是后面字符串的长度(以字节为单位)。您可以先抓取这2个字节,然后将它们转换为整数,并在执行过程中移动位。然后,当您从套接字请求字符串时,可以使用该int作为缓冲区的大小。应该是这样的

C侧:

int-length=0;
字节[]sizeBuffer=新字节[2];
插座。接收(sizeBuffer);
对于(int i=0;i长度=长度一旦建立连接,两端的服务套接字和活动连接套接字就相等且双向。这意味着客户端和服务器不再真正相关。不清楚为什么只需要另一个套接字来发送字符串。或者为什么要将服务器逆转为客户端,反之亦然ersa.我想在你的评论中提到这一点。套接字是双向的。你不需要两个。抱歉,我犯了一个错误,我的意思是,有时候C#server应用程序需要向Java客户端应用程序发送一些数据,但这是不可能的,因为我的Java应用程序无法再侦听该端口,因为它是已经被C#应用程序占用。套接字是双向的,所以现在我确定您不需要额外的套接字,因为您在提到这个事实后发表的评论表明您可能不理解我们的意思。套接字可以使用同一个套接字用于接收和发送。您需要弄清楚您的概念在这里,因为听起来您有点困惑。考虑一个web请求。浏览器连接到服务器并向服务器发送请求。服务器进行响应。所有操作都在同一个套接字连接上。不打开新套接字。不需要新端口。连接后,客户端可以向服务器发送数据,服务器可以向服务器发送数据确认客户端。套接字允许读取和写入同一个套接字实例。一旦连接套接字,客户端和服务器都可以读取和写入。嗨,在我目前的情况下,我可以处理这个问题,因为我的C#应用程序是服务器,我的java应用程序是客户端,我需要的是从我的C#应用程序b发送数据回到java应用程序。一旦建立了连接,客户端和服务器的概念就基本上消失了。然后,你只有两个端点,每个端点都可以发送/接收。如果你想从C#应用程序向java应用程序发送数据,只需抓取C#套接字上的输出流并使用它。然后抓取java端的输入流并读取fr嗯。
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);