【问题标题】:How to simulate Network situation where message lost or server don't send it?如何模拟消息丢失或服务器不发送的网络情况?
【发布时间】:2011-05-22 20:45:33
【问题描述】:

我编写了简单的客户端-服务器应用程序并尝试对其进行测试。

当回复消息(由服务器发送)丢失并且没有到达客户端时,我需要编写一些代码来处理......

我需要知道如何模拟这种情况。但我不能。

我已经尝试了CTRL-C 服务器.. 但不确定这是否是一个好方案.. 我从客户那里得到的:

send:
0 0 0 5 0 0 1 48 25 112 -55 106 0 0 0 34 60 -72 117 -101 37 28 116 -85 -91 61 55
 -126 -50 9 5 64 -87 126 -31 -62 30 13 -90 -72 -124 118 20 88 -80 -9 -36 -33 -38
 123

java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(Unknown Source)
        at net.Net.readMessageObject(Net.java:36)
        at net.Pitcher.run(Pitcher.java:59)
        at net.Pitcher.main(Pitcher.java:122)

顺便说一句,用 Java 编写的应用程序。

【问题讨论】:

    标签: java sockets networking message


    【解决方案1】:

    如果您的应用程序相当简单,您可以使用 netcat 之类的程序连接到它,在某些时候不要发送任何内容,看看会发生什么。 否则,您可以做的是稍微重写您的服务器应用程序,以引入某种随机测试失败。

    【讨论】:

    • 从您的代码来看,您使用的是 TCP,对吗?因为在 TCP 数据包中不会丢失。 TCP 协议确保数据包不会出现格式错误、丢失或乱序。如果你想确保你的应用程序在连接完全丢失时不会中断,Ctrl+C'ing 服务器实际上是一个合理的场景。
    • 感谢您的信息,但是例如超时呢?
    • “超时”是什么意思?服务器崩溃:这将像 Ctrl+C 一样重置连接。您甚至无法连接到服务器:这就像甚至不运行服务器端一样。服务器不响应任何内容:只需评论服务器中的所有答案和处理部分并运行它。这些几乎是连接/服务器可能发生的唯一情况。其他一切都由 TCP 协议处理(比如你不能丢失数据包或其他东西)。
    • 我在服务器上执行了以下操作:对于每 4 条消息,不要发送第 5 次请求的响应。在客户端我使用了socket.setSoTimeout(500)。所以客户端等待消息等待5 500ms,然后将其标记为丢失(最重要的是删除outputStream.read()方法的IO块)并继续发送下一个。
    【解决方案2】:

    创建一个模拟网络对象,以便您可以模拟各种情况,在每种情况下操作模拟网络对象,以便您可以测试您的应用程序是否与它进行了适当的交互。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-17
      • 2016-03-31
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      相关资源
      最近更新 更多