【问题标题】:Java socket programming headerJava 套接字编程头文件
【发布时间】:2024-01-23 00:35:01
【问题描述】:

我正在尝试通过 java 套接字发送文件并通过另一个套接字接收它。但是,会发生这种情况:

发送内容:

/* 这只是一个要传输的文件 */

收到:

所以基本上我无法在堆栈溢出时逃避接收到的内容。它基本上是一堆不可读的字节(大约 32 个字节),然后是我发送的消息。

OutputStream os = sock.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(mybytearray);
oos.flush();
oos.close();

对于客户来说:

BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
FileOutputStream fos = new FileOutputStream("newfile.java");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
bos.write(mybytearray, 0 , current);
bos.flush();
bos.close();
sock.close();

【问题讨论】:

  • 这是来自发送方进程还是接收方进程的转储?

标签: java sockets header file-transfer


【解决方案1】:

为什么要通过ObjectOutputStream?要么直接通过write 方法使用OutputStream,或者如果你觉得有必要选择DataOutputStream

此外,您不应使用Reader 类来传输二进制数据。来自Reader的api:

用于读取字符流的抽象类。


可以在此处找到完整的“通过套接字发送文件”示例:

Transfer a file via Socket.

关键的服务器端代码:

  OutputStream os = sock.getOutputStream();
  System.out.println("Sending...");
  os.write(mybytearray,0,mybytearray.length);
  os.flush();
  sock.close();

关键客户端代码:

bytesRead = is.read(mybytearray,0,mybytearray.length);

【讨论】:

    【解决方案2】:

    查看代码会有所帮助,但您所获得的看起来像是基本的随机数据。需要检查的一些事项:

    1. 接收缓冲区是什么类型的?
    2. 您似乎发送和接收了多少个字符?
    3. 您确定接收端的打印语句指向正确的位置吗?

    【讨论】:

    • 1.接收缓冲区是一个字节[] 2。我想发送 39 个字节并接收 66 3。我认为接收指向正确的位置。该文件已创建,它的 66 字节而不是 39 字节太多。我不确定这是否是您的意思。
    • 是的。请注意,您收到的字节数大约是预期的两倍;这应该让您想知道匹配类型。现在,考虑一下 ObjectOutputStream 的实际作用:它编码一个对象,以便可以恢复它。当您将数据作为 ObjectOutputStream 发送时,Java 会将其编码为数组。请参阅java.sun.com/j2se/1.4.2/docs/api/java/io/… 你得到的是字节数组的“序列化”形式。
    • 哈哈,谢谢,我非常专注于客户端代码,我没有看到我正在发送对象输出流。
    【解决方案3】:

    这没有任何意义。如果您使用 ObjectOutputStream,则必须使用 ObjectInputStream 来读取它。如果你想使用 Reader 来读取它,你必须使用 Writer 来编写它。

    【讨论】:

      最近更新 更多