我和一个朋友正在开发一个项目,该项目要求我们在C#.NET应用程序和Java应用程序之间进行通信。
我们在.NET端使用TcpClient和BinaryWriter类来发送和接收内容。我们使用与此类似的代码发送内容:
byte [] content = //我们在这里获取我们的内容
Writer.Write(new byte [9]); //这是带有TcpClient的NetworkStream的BinaryWriter
Writer.Flush();
在Java方面,我们使用netty来处理我们的网络。要接收我们从.NET端发送的内容,我们将ChannelInboundHandlerAdapter添加到管道并使用channelRead方法读取内容:
public void channelRead(ChannelHandlerContext ctx,Object received)
{
ByteBuf收到了ByteBuf =(ByteBuf)收到的;
this.bytesRead = receivedByteBuf.readableBytes();
System.out.println("收到" + this.bytesRead +" bytes。");
final byte [] buffer = new byte [this.bytesRead];
receivedByteBuf.markReaderIndex();
receivedByteBuf.readBytes(缓冲液);
receivedByteBuf.resetReaderIndex();
}
现在奇怪的是,当我们尝试发送内容时,它并不总是以一个整体形式出现。有时我们只收到我们最初发送的所有字节,而这些字节都是在channelRead的新调用中到达的。在这个例子中,只有6-8个字节到达。这很奇怪,因为这只在使用.NET时才会发生。我们尝试使用python发送内容,一切正常,它到达一个channelRead调用。
导入套接字
导入字符串,随机
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((" 127.0.0.1",8888))
s.send('' .join(random.choice(string.lowercase)for x in range(500)))
S.CLOSE()
不幸的是,我们项目的性质使我们无法更改我们的Java网络库,因此我们仍然坚持使用netty。
我们是否错过了netty中的某些设置,还是这与.NET TCP库的性质有关?我们将不胜感激。