正在努力学习的小白袁 2023-04-10 18:53 采纳率: 87%
浏览 13
已结题

java刚学网络编程客户端和服务端出现的疑问

我的程序:客户端发送一张图片到服务端,服务端接收后发送一条信息给客户端,客户端收到信息后关闭程序,同样服务端也关闭了
(1)出现的问题:1.在服务端一直调不出来while循环,为什么?
2.在客户端因为服务端跳不出循环,导致一直在阻塞状态

客户端程序

package TCP_FileCopy;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class TCP_Client {
    public static void main(String[] args) throws IOException {
        String pathSent="D:\\null_.jpg";
        //1.建立端口连接
        Socket socket=new Socket(InetAddress.getLocalHost(),8888);
        //定义发送的流,一个是输入流,用于读取文件FileInputStream fis=new FileInputStream("D:\\null_.jpg");
        // 一个是输出流,用于发送文件 OutputStream ops= socket.getOutputStream();
        OutputStream ops= socket.getOutputStream();
        FileInputStream fis=new FileInputStream("D:\\null_.jpg");


        BufferedInputStream bis = new BufferedInputStream(fis);
        BufferedOutputStream bos = new BufferedOutputStream(ops);
        byte[] bytes=new byte[1024];
        int readline;
        while((readline= bis.read(bytes))!=-1){
            bos.write(bytes,0,readline);
        }
        bos.flush();
        System.out.println("Client发送图片成功!");
        //定义一个流用于接收对方发来的字符流图片
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String s= bufferedReader.readLine();
        System.out.println(s);

        //读完之后关闭所有的流文件
        System.out.println("任务完成");
        bufferedReader.close();
        fis.close();
        ops.close();
        socket.close();
    }
}


服务端程序

package TCP_FileCopy;

import com.sun.corba.se.spi.orbutil.fsm.Input;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TCP_Server {
    public static void main(String[] args) throws IOException {
        //输出到目标文件的敌方
        String s="src\\null2.jpg";
        //先建立一个端口
        ServerSocket sockets=new ServerSocket(8888);

        //建立一个连接
        System.out.println("已建立端口,等待连接");
        Socket socket=sockets.accept();

        //建立字节输入流,用于接收文件。输出流,用于创建文件
        InputStream is= socket.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);
        OutputStream os=new FileOutputStream(s);
        BufferedOutputStream bos = new BufferedOutputStream(os);
        byte[] bytes=new byte[1024];
        int readline;
        System.out.println("已接受文件,正在拷贝");
        while((readline=bis.read(bytes))!=-1){
            bos.write(bytes,0,readline);
        }
        System.out.println("拷贝成功");

        //建立输入流,用于接收服务端发送的文字
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bufferedWriter.write("Server收到图片");
        bufferedWriter.newLine();
//        bufferedWriter.flush();
//        socket.shutdownOutput();
        bufferedWriter.close();
        //关闭所有的流
        os.close();
        is.close();
        //bufferedWriter.close();
        //socket.close();
        sockets.close();
    }
}

  • 写回答

2条回答 默认 最新

  • Vayne16 2023-04-10 19:10
    关注

    1.服务端中while循环调不出来的原因是服务端在接收完所有数据后,需要手动关闭输入流is,关闭方法为is.close(),不然服务端会一直等待客户端继续向它传输数据,而不会跳出循环。
    2.在客户端,出现阻塞状态的原因是服务端关闭,而客户端在等待服务端发送数据,如果一直没有关闭连接,此时可以在服务端发送完数据后,调用socket.shutdownOutput()方法,表示输出流关闭,通知客户端数据已全部发送完毕,客户端此时可以正常退出程序。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月18日
  • 已采纳回答 4月10日
  • 创建了问题 4月10日

悬赏问题

  • ¥40 求一款能支持ios15以上的屏蔽越狱插件。比较好用的
  • ¥15 C++ QT对比内存字符(形式不定)
  • ¥30 C++第三方库libiconv 远程安装协助
  • ¥15 https://github.com/youlaitech/vue3-element-admin/blob/master/src/store/modules/user.ts 这2句代码如何理解
  • ¥15 duilib开发文本字串超过长度显示
  • ¥20 mysql的.ibd文件为啥那么多
  • ¥15 C++中采用栈和BFS算法求解迷宫问题
  • ¥15 关于#java#的问题:这是跳转失败出现的界面这是哪个出现问题的servlet(开发工具-ide)
  • ¥15 EBS R12费用采购跨月冲销
  • ¥15 python中用mplfinance如何做到多股同列?