鱼C论坛

 找回密码
 立即注册
查看: 3118|回复: 1

Java IO网络编程为什么这里没有阻塞

[复制链接]
发表于 2019-9-23 22:08:41 | 显示全部楼层 |阅读模式
30鱼币
本帖最后由 Aojacy 于 2019-9-23 22:58 编辑
package netStream;

import org.junit.Test;

import java.io.*;
import java.net.*;

public class SocketTest2 {
    @Test
    public void clientTest()  {
        Socket socket = null;
        OutputStream os = null;
        try {
            socket = new Socket(InetAddress.getByName("127.0.0.1"), 9090);
            os = socket.getOutputStream();
            FileInputStream fis = new FileInputStream(new File("hello1.jpg"));
            byte[] buff = new byte[1024];
            int len;
            while ((len = fis.read(buff))!=-1){
                os.write(buff,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    @Test
    public void serveTest() throws IOException {
        ServerSocket serverSocket = null;
        Socket acceptSocket = null;
        InputStream is = null;
        FileOutputStream fos = null;
        try {
            serverSocket = new ServerSocket(9090);
            acceptSocket = serverSocket.accept();
            is = acceptSocket.getInputStream();
            fos = new FileOutputStream(new File("hello2.jpg"));
            byte[] buff = new byte[1024];
            int len;
            while ((len = is.read(buff))!=-1){
                fos.write(buff,0,len);
            }
            System.out.println("复制成功");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fos!=null){
                fos.close();
            }
            if(is!=null){
                is.close();
            }
            if(acceptSocket!=null){
                acceptSocket.close();
            }
            if(serverSocket!=null){
                serverSocket.close();
            }
        }
    }
}
按理说第57行不会执行到,上面循环会进入阻塞,为什么实际没有阻塞?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-23 22:56:57 | 显示全部楼层
自己想通了,后面紧跟着有个close(),应该和socket.shutdownOutput()作用差不多,可以让服务器接收到文件结束标记
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 14:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表