正在努力学习的小白袁 2023-04-10 18:53 采纳率: 90%
浏览 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日

悬赏问题

  • ¥15 Android STD快速启动
  • ¥15 如何使用simulink建立一个永磁同步直线电机模型?
  • ¥30 天体光谱图的的绘制并得到星表
  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动