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 带DataOutputStream的套接字输出流-保证是什么?_Java_Sockets_Exception - Fatal编程技术网

Java 带DataOutputStream的套接字输出流-保证是什么?

Java 带DataOutputStream的套接字输出流-保证是什么?,java,sockets,exception,Java,Sockets,Exception,看看代码: private static void send(final Socket socket, final String data) throws IOException { final OutputStream os = socket.getOutputStream(); final DataOutputStream dos = new DataOutputStream(os); dos.writeUTF(data); dos.flush(); } 我

看看代码:

private static void send(final Socket socket, final String data) throws IOException {
    final OutputStream os = socket.getOutputStream();
    final DataOutputStream dos = new DataOutputStream(os);
    dos.writeUTF(data);
    dos.flush();
}

我是否可以确定调用此方法会引发
IOException
(这意味着我最好关闭套接字),或者,如果没有引发异常,则我发送的数据将保证完全发送?当我读取另一个端点上的数据时,我得到的字符串不完整,没有异常情况吗?

发送和接收之间存在很大差异。您可以成功地从应用程序发送数据,但数据随后会传递给

  • 你机器上的操作系统
  • 网络适配器
  • 网络上的交换机
  • 远程计算机上的网络适配器
  • 远程计算机上的操作系统
  • 远程计算机上的应用程序缓冲区
  • 无论应用程序如何处理它
这些阶段中的任何一个都可能失败,而你的发送者也不会更聪明


如果您想知道应用程序已成功接收并处理了数据,它必须向您返回一条消息,说明发生了这种情况。当你收到这封信时,你就知道它已经收到了。

发送和接收之间有很大的区别。您可以成功地从应用程序发送数据,但数据随后会传递给

  • 你机器上的操作系统
  • 网络适配器
  • 网络上的交换机
  • 远程计算机上的网络适配器
  • 远程计算机上的操作系统
  • 远程计算机上的应用程序缓冲区
  • 无论应用程序如何处理它
这些阶段中的任何一个都可能失败,而你的发送者也不会更聪明


如果您想知道应用程序已成功接收并处理了数据,它必须向您返回一条消息,说明发生了这种情况。当您收到此邮件时,您就知道它已收到。

是的,可能会发生几种情况。首先,请记住
write
返回速度非常快,因此不要认为执行了太多错误检查(我的所有数据都已确认了吗?)

1号门 您可以
写入
刷新
数据
TCP
尽其所能地提供它。这意味着它可能会执行重传之类的操作。当然,您的
send
不会被卡住这么长时间(在某些情况下,
TCP
会尝试5-10分钟,然后才会启动连接)。因此,你永远不会知道对方是否真的收到了你的信息。您将在套接字的下一个操作中收到错误消息

2号门 您可以
写入
刷新
数据。由于肮脏和字符串很长,它被分为多个数据包发送。因此,您的同级
会阅读其中的一部分内容,并在获得所有内容之前将其呈现给用户


因此,想象你发送:“你好,黑暗,我的老朋友,我又来和你说话了”。另一方可能会得到“Hello Darky m”。但是,如果它执行后续的
read
s,它将获得整个数据。因此,远端TCP实际上已经接收了所有信息,它已经确认了所有信息,但是用户应用程序无法读取数据,以便将其从TCPs手中夺走。

是的,可能会发生一些情况。首先,请记住
write
返回速度非常快,因此不要认为执行了太多错误检查(我的所有数据都已确认了吗?)

1号门 您可以
写入
刷新
数据
TCP
尽其所能地提供它。这意味着它可能会执行重传之类的操作。当然,您的
send
不会被卡住这么长时间(在某些情况下,
TCP
会尝试5-10分钟,然后才会启动连接)。因此,你永远不会知道对方是否真的收到了你的信息。您将在套接字的下一个操作中收到错误消息

2号门 您可以
写入
刷新
数据。由于肮脏和字符串很长,它被分为多个数据包发送。因此,您的同级
会阅读其中的一部分内容,并在获得所有内容之前将其呈现给用户


因此,想象你发送:“你好,黑暗,我的老朋友,我又来和你说话了”。另一方可能会得到“Hello Darky m”。但是,如果它执行后续的
read
s,它将获得整个数据。因此,远端TCP实际上已经接收了所有内容,它已经确认了所有内容,但是用户应用程序无法读取数据,以便将其从TCPs手中取出。

除了最后两点,TCP应该处理它,不是吗?好的,想法是-我需要从一个端点发送一个字符串到另一个端点。这里的正确方法是什么,以确保收到的数据至少是“完整的”?我是否可能发送“HELLO”而只接收“HELL”?TCP将尽最大努力,但无法保证在发生故障时,发送方仍不会收到异常。如果使用readUTF()且字符串不完整,则接收方将收到EOFEException。如果接收器一次读取一个字节,它可能会看到“H”“E”“L”“L”,但它也可以确定字符串不完整,因为长度是先发送的。@Peter Lawrey:谢谢!因此,我至少可以依靠
readUTF()
获取完整数据或异常。除了最后两点,TCP应该处理它,不是吗?好的,想法是-我需要从一个端点发送字符串到另一个端点。这里的正确方法是什么,以确保收到的数据至少是“完整的”?我是否可能发送“HELLO”而只接收“HELL”?TCP将尽最大努力,但无法保证在发生故障时,发送方仍不会收到异常。如果使用readUTF()且字符串不完整,则接收方将收到EOFEException。如果接收器一次读取一个字节,则可能会看到“H”“E”“L”“L”,但