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

客户端向服务发送数据。服务器收到数据后给客户端反馈。

可是程序运行之后并没有返回数据给客户端,而且程序也没有停下来。


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());

   }


尚方宝剑之说
浏览 518回答 1
1回答

叮当猫咪

不评论代码的其他问题,仅回答为什么你的代码看上去像是死循环:因为服务端一直再接收客户端传送来的数据,一直读到-1个字节(或者说EOF)才会跳出那个while循环,但是除非你close客户端的socket.close(), 服务端是不会收到EOF的,所以你的服务端代码一直在等待客户端传数据过来。否则不会发送传输完毕的回答。与此同时,因为服务端代码不发送传输完毕的回答,客户端也在苦等服务端的响应,直到双方某一方超时(你没设置任何一端超时)。改进方案:我认为你这是希望通过这一个socket做双向通信,因此你需要设置一套自己的协议,比如先发4个字节过去,告诉服务端我这个文件的长度是多少,接下来服务端接收了这么多字节就表示文件接收完毕,返回响应消息。除非你是想学习socket通信,否则为了实现文件传输,建议使用成熟的协议和方案,比如ftp或者http之类的。另外我很好奇 Socket socket = new Socket(InetAddress.getLocalHost(), 10000); 我怎么把服务端关闭了,它仍然可以连接成功?不抛connection refuse异常。。。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java