Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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通过Java.net.Socket将32位int截断为单字节?或者用别的什么?_Java_Sockets_Tcp - Fatal编程技术网

如何阻止Java通过Java.net.Socket将32位int截断为单字节?或者用别的什么?

如何阻止Java通过Java.net.Socket将32位int截断为单字节?或者用别的什么?,java,sockets,tcp,Java,Sockets,Tcp,因此,代码非常简单 int len = 0x00000097; Socket sock = new Socket(host, port); DataOutputStream out = new DataOutputStream(sock.getOutputStream()); out.write(i); out.flush(); out.write(xml_doc); out.flush(); 因此,这个想法是,宿主希望得到一个xml表单,但它的长度是预先确定的。表单只有151个字节,主机希望

因此,代码非常简单

int len = 0x00000097;
Socket sock = new Socket(host, port);
DataOutputStream out = new DataOutputStream(sock.getOutputStream());
out.write(i);
out.flush();
out.write(xml_doc);
out.flush();
因此,这个想法是,宿主希望得到一个xml表单,但它的长度是预先确定的。表单只有151个字节,主机希望它的长度是4字节的整数,我相信这在Java中是整数的大小,但不管我尝试哪种流、打印和写入类型以及组合,WireShark在电线上说,我的数据包包含一个字节,前导零被截断,只剩下一个字节。我需要一双新眼睛,伙计们!请和谢谢。

您正在调用
数据输出流
,该流记录如下:

将参数b的八个低位写入输出流。忽略b的24个高阶位

我怀疑你真的想要:

将int作为四个字节写入底层输出流,首先是高字节。如果未引发异常,则写入的计数器将递增4

因此:


始终检查您使用的方法的Javadoc,尤其是当它们的行为与您期望的不一致时。

请更加注意代码的格式-在我编辑代码之前,它们都在一行中。在发布之前,请使用预览查看您的问题的外观,并仅在看起来合适时发布。我很惊讶,就我所知,代码甚至编译-
DataOutputStream
没有
print
方法。你确定那是你真正的密码吗?也许你真的有了
write
而不是
print
?这是write(),很抱歉,但我尝试过将OutputStreamWriter包装到PrintWriter中,也尝试过向OutputStreamWriter写入,还有很多其他方法。好的,我已经相应地编辑了你的文章。请在发帖前注意这类事情。我想你只是教我一看到麻烦就去寻找JavaDocs。再次感谢乔恩,你就是那个人。只是检查一下,flush()应该会刷新写入的int()的所有四个字节,对吗?因为wireshark告诉我,第一个字节确实是与first flush()一起发送的,然后其他三个字节被附加到我的xml表单的开头作为。不确定为什么int现在是一个方法。。。今天肯定很累。@confusedrussian1:
flush()
不一定会刷新到实际的网络,据我所知,它只是刷新内部缓冲区。但只要您将TCP用作流协议(您应该这样做),它就不会影响您。
out.writeInt(i);