当前位置: 首页 > 编程语言 > C#

从C#客户端向Java服务器发送4字节消息头分享

时间:2023-04-10 18:16:30 C#

从C#客户端向Java服务器发送4字节消息头我正在尝试编写一个C#客户端到服务器上的Java服务器。服务器需要一个4字节(Java中的DataInputSreadreadInt())消息头,后跟实际消息。我是C#新手,如何将此消息发送到JavaServer?我尝试了几种方法(主要是反复试验,没有深入研究C#语言),但没有任何效果。Java端以不正确(非常大)的消息长度结束。正如其他海报所指出的那样,它始终是字节顺序。JavaDataInputStream期望数据是大端(网络字节顺序)。从Mono文档(对于像BinaryWriter这样的等价物),C#倾向于小端(Win32/x86的默认设置)。所以当你使用标准类库将32位int'1'更改为byte时,它??们会产生不同的结果://bytehexvaluesJava:00000001C#:01000000你可以在C中更改#中int的写法:privatestaticvoidWriteInt(Streamstream,intn){for(inti=3;i>=0;i--){intshift=i*8;//要移动的位byteb=(byte)(n>>shift);stream.WriteByte(b);}}编辑:更安全的方法是:privatestaticvoidWriteToNetwork(System.IO.BinaryWriterstream,intn){n=System.Net.IPAddress.HostToNetworkOrder(n);stream.Write(n);这很简单,但是你检查字节顺序了吗?您发送的数据的字节序与您接收的字节序很容易不匹配。正如这里的每个人都已经指出的那样,问题很可能是由于C#应用程序以小端顺序发送整数,而Java应用程序期望它们是网络顺序(大端)。然而,不是在C#应用程序中显式重新排列字节,正确的方法是依靠内置函数将主机转换为网络顺序(htons等)——这样即使在运行在大上端机。通常在解决这些问题时,我发现使用netcat或wireshark等工具记录正确的流量(例如Java中的Java)然后将其与不正确的流量进行比较以查看它在哪里出错是很有用的。作为额外的好处,您还可以使用netcat将捕获/预先记录的请求注入到服务器,或者将捕获/预先记录的响应注入到客户端。更不用说您还可以修改文件中的请求/响应并在开始修复代码之前测试结果。如果您要交换大量数据,我建议实施(或寻找)一个可以按网络顺序写入和读取整数的Stream-wrapper。但是,如果您真的只需要写长度,请执行以下操作:using(Socketsocket=...){NetworkStreamns=newNetworkStream(socket);ns.WriteByte((大小>>24)&0xFF);ns.WriteByte((大小>>16)&0xFF);ns.WriteByte((大小>>8)&0xFF);ns.WriteByte(大小&0xFF);//写入实际消息}我不懂C#,但你只需要这样做:out.write((len>>>24)&0xFF);out.write((len>>>16)&0xFF);out.write((len>>>8)&0xFF);out.write((len>>>0)&0xFF);Sysetm.Net.IPAddress类有两个静态辅助方法:HostToNetworkOrder()和NetworkToHostOrder()来为您进行转换。可以在stream上使用BinaryWriter写入正确的值:以上是C#学习教程:Sending4-bytemessageheadersfromtheC#clienttotheJavaserver全部内容分享,如果对大家有用需要了解一下more关于C#学习教程,希望大家多多关注——using(Socketsocket=newSocket())using(NetworkStreamstream=newNetworkStream(socket))using(BinaryWriterwriter=newBinaryWriter(stream)){intmyValue=42;作家。写(IPAddress.HostToNetworkOrder(myValue));}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: