首页 > 这个程序问题在哪里?为什么好像陷入死循环?

这个程序问题在哪里?为什么好像陷入死循环?

客户端向服务发送数据。服务器收到数据后给客户端反馈。
可是程序运行之后并没有返回数据给客户端,而且程序也没有停下来。

class TcoClient{
    public static void main(String[] args) throws IOException {
       BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\abs.apk"));
       Socket socket = new Socket(InetAddress.getLocalHost(), 10000);
       OutputStream os = socket.getOutputStream();
       byte[] buf = new byte[1024];
       int len;
       while ((len = bis.read(buf)) != -1) {
           os.write(buf, 0, len);
       }
       InputStream is = socket.getInputStream();
       int backLen = is.read(buf);
       System.out.println(new String(buf, 0, backLen));
       os.close();
   }
}

class TcpServer {
   public static void main(String[] args) throws IOException {
       ServerSocket serverSocket = new ServerSocket(10000);
       Socket socket = serverSocket.accept();
       InputStream is = socket.getInputStream();
       BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\cde.apk"));
       byte[] buf = new byte[1024*1024];
       int len;
       while ((len = is.read(buf)) != -1) {
           bos.write(buf, 0, len);
       }
       OutputStream os = socket.getOutputStream();
       os.write("文件传输完成".getBytes());
   }

不评论代码的其他问题,仅回答为什么你的代码看上去像是死循环:因为服务端一直再接收客户端传送来的数据,一直读到-1个字节(或者说EOF)才会跳出那个while循环,但是除非你close客户端的socket.close(), 服务端是不会收到EOF的,所以你的服务端代码一直在等待客户端传数据过来。否则不会发送传输完毕的回答。

与此同时,因为服务端代码不发送传输完毕的回答,客户端也在苦等服务端的响应,直到双方某一方超时(你没设置任何一端超时)。

改进方案:
我认为你这是希望通过这一个socket做双向通信,因此你需要设置一套自己的协议,比如先发4个字节过去,告诉服务端我这个文件的长度是多少,接下来服务端接收了这么多字节就表示文件接收完毕,返回响应消息。

除非你是想学习socket通信,否则为了实现文件传输,建议使用成熟的协议和方案,比如ftp或者http之类的。

另外我很好奇 Socket socket = new Socket(InetAddress.getLocalHost(), 10000); 我怎么把服务端关闭了,它仍然可以连接成功?不抛connection refuse异常。。。

【热门文章】
【热门文章】