如何同步读取和写入套接字?

时间:2010-03-22 15:36:14

标签: java sockets

我们创建一个套接字。在套接字的一侧,我们有一个“服务器”,另一边有一个“客户端”。服务器和客户端都可以写入和读取套接字。这是我的理解。我不明白以下事项:

  1. 如果服务器从套接字读取,它是否只在套接字中看到客户端写入套接字的那些东西?我的意思是如果服务器向套接字写入内容而不是从套接字读取,它(服务器)是否会在套接字中看到它(服务器)在那里写的内容?我希望不会。

  2. 让我们考虑以下情况。客户端向套接字写入内容,然后将新内容写入套接字,然后服务器从套接字读取。服务器会在那里看到什么?只有客户写的“新”东西或“新”和“旧”的东西?

  3. 如果客户端(或服务器)写入套接字,是否可以查看其他方是否收到了书面信息?例如,out.println("Hello, Server!")将返回true服务器收到此消息。

3 个答案:

答案 0 :(得分:4)

套接字连接表示两个单向流:一个从客户端到服务器,一个从服务器到客户端。

每一方都可以将数据放入一个流中并从另一个流中读取。

将放入一个流的数据附加到已经存在的数据的末尾。

当从流的一端读取数据时,将读取最旧的可用数据(即,流是FIFO)。

这些陈述应该使您能够回答所有问题,但我也会明确说明:

  1. 服务器只会读取客户端编写的内容,而不会读取自己编写的内容
  2. 服务器将首先阅读旧内容,然后阅读新内容
  3. 除非服务器发送响应内容,否则客户端无法立即知道数据是否实际被另一方接收。在某些情况下,它可以知道发送是否失败(例如,当客户端存在物理问题时),但通常不能依赖该通知。

答案 1 :(得分:0)

  1. 你是对的。服务器只会看到客户端写入套接字的内容

  2. 服务器应该看到旧的和新的(旧的第一个然后是新的)

  3. 我认为这取决于它是什么类型的套接字。 TCP将是可靠的(您的数据将使其到达另一端),而UDP不关心(您只是希望数据尽可能快并且丢失是可接受的,即视频流)。但是,除非您在套接字中发回响应,否则您不会知道是否收到了消息。

答案 2 :(得分:0)

套接字提供两个单向“管道”与另一端通信:一个用于读取数据(InputStream),另一个用于发送数据(OutputStream)。 因此,在输出流中写入内容后立即读入输入流没有危险。

其次,将新数据写入输出流不会覆盖或替换“旧”内容。内容被缓冲,直到另一个应用程序读取它。

最后,对方不会确认数据接收,但如果在发送数据后没有收到任何IOException,您可以确定其他应用程序已收到它。