为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

尚方宝剑之说 2019-03-22 18:19:09
客户端向服务发送数据。服务器收到数据后给客户端反馈。可是程序运行之后并没有返回数据给客户端,而且程序也没有停下来。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 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

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

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

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

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

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


查看完整回答
反对 回复 2019-04-16
  • 1 回答
  • 0 关注
  • 517 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信