JAVA:网络编程之Socket类、阻塞问题

本文介绍了使用JAVA进行网络编程的小练习——文件上传案例,包括客户端和服务器端的代码实现。特别强调了在操作字节输入流时read()方法可能引发的阻塞问题,提醒开发者注意该问题的处理。

此文贴上一个刚学习网络编程的一个小练习:文件上传案例

客户端代码

public class Demo02Client {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("day12-code\\2.jpg");
        Socket socket = new Socket("127.0.0.1", 8888);
        OutputStream os = socket.getOutputStream();

        int len = 0;
        byte[] bytes = new byte[1024];
        while((len = fis.read(bytes)) != -1) {
            os.write(bytes, 0, len);
        }

        //重要!禁用此套接字socket的输出流。
        // 这样服务器端的网络字节输入流便不会发生阻塞。
        socket.shutdownOutput();

        InputStream is = socket.getInputStream();
        while((len = is.read(bytes)) != -1) {
            System.out.println(new String(bytes, 0, len));
        }

        fis.close();
        socket.close();
    }
}

服务器端代码

public class Demo02Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        while(true) {//死循环,使服务器端始终处于监听状态
            new Thread(new Runnable() {//使用多线程提高服务器效率。每当一个客户端上传照片,便开启一个线程进行处理
                @Override
                public void run() {
                    try{ //因为线程的run()方法没有抛出异常,所以run()里面的代码也无法抛出异常。因此使用try\catch进行异常处理
                        Socket socket = serverSocket.accept();//侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。

                        InputStream is = socket.getInputStream();//网络字节输入流


                        File file = new File("day12-code\\upLoad");//判断服务器端存储文件的位置的文件夹是否存在
                        if(!file.exists()) {
                            file.mkdirs();
                        }

                        String fileName = "" + System.currentTimeMillis() + new Random().nextInt(1000) + ".jpg";//创建一个不重复的图片文件名
                        FileOutputStream fos = new FileOutputStream("day12-code\\upLoad\\" + fileName);

                        int len = 0;
                        byte[] bytes = new byte[1024];
                        while ((len = is.read(bytes)) != -1) {//读取客户端的网络字节流
                            fos.write(bytes, 0, len);//服务器端写入本地硬盘
                        }

                        OutputStream os = socket.getOutputStream();
                        os.write("服务器端收到!".getBytes());//服务器端返回给客户端 “确认接受” 这一消息

                        /*
                        此处可不写,因为下面有socket.close(),依旧会将此字节输出流关闭
                        socket.shutdownOutput();*/

                        socket.close();//关闭此套接字。 同时关闭与该客户端的通道。
                        fos.close();
                    }catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
}

注意事项:
此案的需要注意字节输入流read()方法的阻塞问题。
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值