当前位置: 首页 > 知识库问答 >
问题:

如何在java中使用普通套接字生成返回二进制数据的http post

百里阳平
2023-03-14

由于一些限制,我不得不使用普通的Java套接字下载在http网站上发布的文件。以下是我阅读回复的方式:

String serverIp = "192....";
int serverPort = 3000;
String url = "/path/to/file";

Socket socket = new Socket(serverIp, serverPort);

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

String postContent = "content";

writer.write("POST " + url + " HTTP/1.0\r\n");
writer.write("Content-length: " + postContent.length() + "\r\n");
writer.write("\r\n");
writer.write(postContent);
writer.flush();

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String line = null;

while ((line = reader.readLine()) != null) {
    if (!line.trim().equals("")) {
        //Process header
    } else {
        break;
    }
}

int intChar = -1;
ByteArrayOutputStream out = new ByteArrayOutputStream();

while ((intChar = reader.read()) >= 0) {
    out.write(intChar);
}
byte[] byteArray = out.toByteArray();

File outFile = new File("myfile.zip");
FileOutputStream fileOutputStream = new FileOutputStream(outFile);
fileOutputStream.write(byteArray);
fileOutputStream.close();


每件事都工作正常,但是文件myfile.zip保存不一致。如果我使用解压缩来解压缩文件,我会得到错误:

Archive:  myfile.zip
error [myfile.zip]:  missing 55053 bytes in zipfile
  (attempting to process anyway)
error [myfile.zip]:  start of central directory not found;
  zipfile corrupt.
  (please check that you have transferred or created the zipfile in the
  appropriate BINARY mode and that you have compiled UnZip properly)

当我使用curl进行http post时,myfile。zip下载一致,我就可以打开它了。

有光吗?

共有1个答案

龚德本
2023-03-14

谢谢大家。我根据詹姆斯·K·波尔克总统的建议编写了以下解决方案:


String serverIp = "192....";
int serverPort = 3000;
String url = "/path/to/file";

Socket socket = new Socket(serverIp, serverPort);

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

String postContent = "content";

writer.write("POST " + url + " HTTP/1.0\r\n");
writer.write("Content-length: " + postContent.length() + "\r\n");
writer.write("\r\n");
writer.write(postContent);
writer.flush();

DataInputStream reader = new DataInputStream(socket.getInputStream());
int c = -1;
StringBuilder header = new StringBuilder();

while ((c = reader.read()) >= 0) {
    header.append((char) c);
    if (header.length() > 4 && header.substring(header.length() - 4).equals("\r\n\r\n")) {
        break;
    }
}

File outFile = new File("myfile.zip");
FileOutputStream fileOutputStream = new FileOutputStream(outFile);
while ((c = reader.read()) >= 0) {
    fileOutputStream.write(c);
}

reader.close();
fileOutputStream.close();

 类似资料:
  • 我必须对FTP服务器进行编码,而且我在数据传输方面遇到了问题。 我在linux上使用ftp命令来测试它,我目前正在使用,它发送工作目录中的文件/目录列表。一切正常(ftp打印文件列表),除了ftp打印以下警告: 我想删除该警告,我认为ftp需要二进制数据,但我不知道如何通过套接字发送这样的数据,我目前正在使用最基本的方式发送结果:

  • 问题内容: 我已经看到了许多在Java中通过套接字发送序列化数据的示例,但是我想要的只是发送一些简单的整数和字符串。而且,问题是我正在尝试将这些信息传递给用C编写的二进制文件。 因此,最重要的是:如何在Java中通过套接字发送一些字节? 问题答案: 我真的建议不要直接使用Java Sockets库。我发现Netty(来自JBoss)非常易于实现且功能强大。Netty ChannelBuffer类带

  • 问题内容: 我的文件中有二进制数据,可以将其读入字节数组并进行处理。现在,我需要通过网络连接将部分数据作为XML文档中的元素发送。我的问题是,当我将数据从字节数组转换为String并返回到字节数组时,数据已损坏。我已经在一台机器上对此进行了测试,以将问题隔离到String转换中,所以现在我知道它不会被XML解析器或网络传输损坏。 我现在所拥有的是 有谁知道如何将二进制转换为String并返回而不会

  • 我试图实现的是从url获取(图像的)二进制数据,该url通过php脚本(动态)生成图像,并使用sqlalchemy将该数据保存到数据库中。当我尝试使用python或ipython解释器实现这一点时,返回数据,但使用脚本中的相同代码,数据是一个空白字符串。 返回以下二进制数据: 第一个print语句返回: http://www.example.com/getImage.php?e=23f4904fh

  • 问题内容: 我真的很困惑如何通过套接字发送图像数据类型。请帮我。我已经搜寻了如何将Image数据类型转换为char [],但结果为0。 问题答案: 您可以使用以下方法将其转换为(source): 然后,您可以使用ImageIO.write()方法写入结果。

  • 我是Java初学者。我有一个设备,每隔5s发送一次UDP广播ping包,很少发送警报(一种警报)。 我希望有一个java程序,它监听ping数据包,并显示上次ping以来的时间,如果在一定的时间内没有收到ping,或者如果收到来自传感器的实际警报,它会发出某种警报。 我无耻地从stackoverflow复制了这段代码,但是阻塞,所以计数器不能工作。 我认为我需要生成一个线程来打开套接字并等待接收到