【问题标题】:Socket is not reading data套接字未读取数据
【发布时间】:2014-03-07 16:46:20
【问题描述】:

我正在尝试一个简单的 Java 程序来发送和接收数据...服务器正在发送数据,客户端接收...但这会产生 Socket Exception : Connection Reset

这是我发送整数值的服务器端代码...

try {
   ServerSocket server = new ServerSocket(9089);

   Socket socket = server.accept();

   OutputStream out = socket.getOutputStream();
   out.write(12);
   out.flush();
   System.out.println("Data Sent....");
   Thread.sleep(5000);
} catch(Exception  e) {
   System.out.println("Server Error : " + e.toString());
}

这是我接收该 Int 值的客户端代码...

try {
   Socket client = new Socket(InetAddress.getLocalHost(), 9089);
   System.out.println("Connected ....");

   InputStream in = client.getInputStream();
   while(in.available()>0)
   {
      System.out.println("Unavailable...");
   }
   System.out.println("Received : " + in.read() );
   in.close();
} catch(Exception e) {
   System.out.println("Sender Error : " + e.toString());
}

【问题讨论】:

  • 你看到了什么行为?
  • 显示从服务器数据发送的消息......但在客户端它进入“while(in.available>0)”循环几秒钟,然后生成SocketException......
  • 我猜当你的服务器端从睡眠中返回时抛出了 SocketException。您的服务器端是否在睡眠后终止?

标签: java sockets


【解决方案1】:
   while(in.available()>0)
   {
      System.out.println("Unavailable...");
   }

这没有任何意义。 available() 返回可用的字节数。如果结果是肯定的,则数据是可用的,不是不可用的。

但是这个循环完全没有意义,应该完全删除。以下read() 将根据需要阻止。

【讨论】:

    【解决方案2】:

    在您的客户端代码中,我认为您必须更改 while 循环的条件:

    while(in.available()==0) {
        System.out.println("Unavailable...");
    }
    System.out.println("Received : " + in.read() );
    in.close()
    

    【讨论】:

    • 只需删除read() 中的测试和阻止即可。自旋循环而不是阻塞没有什么可推荐的。
    【解决方案3】:

    我会说这个代码

    while(in.available()>0)
    {
        System.out.println("Unavailable...");
    }
    

    如果数据可用,将导致无限循环。

    试试

    while(in.available() == 0)
    

    【讨论】:

      猜你喜欢
      • 2014-09-15
      • 2011-09-15
      • 2014-06-07
      • 2016-02-20
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多