liao535864243 2021-10-27 12:16 采纳率: 100%
浏览 69
已结题

Java ObjectInputStream 传输时,总是接收不完整

初学者
用ObjectOutputStream从服务端传送给客户端
传输对象少还没问题
对象数据稍微多一点就传不完整,并且客户端抛出
connection reset

在网上搜了好久,知道产生的原因是客户端没有接受完全,服务端退出导致的

但是不知道怎么解决

初学者很多东西也看不懂
还请赐教

客户端代码:

package com;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;

public class AllDetails {
    public AllDetails() {
    }

    @SuppressWarnings("unchecked")
    public ArrayList<Detail> getAllDetails(int z_m) {
        Conn conn = new Conn();// 实例化远程连接类,准备远程连接
        ArrayList<Detail> allDetails = new ArrayList<Detail>();
        try {
            Socket client = new Socket(conn.getAddress(), conn.getPort());// 实例化客户端
            // 传输请求信息
            DataOutputStream outData = new DataOutputStream(client.getOutputStream());
            outData.writeUTF("AllDetails|" + z_m);
            // 接收结果
            ObjectInputStream getBack = new ObjectInputStream(client.getInputStream());
            allDetails = (ArrayList<Detail>) getBack.readObject();
            client.close();// 关闭远程连接
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return allDetails;
    }
}

服务端代码:

package main;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import com.AllDetails;
import com.Detail;

public class ReServer {
    public ReServer() {
        while (true) {
            try {
                ServerSocket serverSocket = new ServerSocket(3402);
                Socket client = serverSocket.accept();
                DataInputStream request = new DataInputStream(client.getInputStream());
                String[] requestArray = request.readUTF().split("\\|");// 将客户端传来的请求,生成String数组
                if (requestArray[0].equals("AllDetails")) {
                    ArrayList<Detail> result = new ArrayList<Detail>();
                    result = new AllDetails().getDetails(Integer.parseInt(requestArray[1]));// 调用查询程序,并获取结果
                    ObjectOutputStream resultOut = new ObjectOutputStream(client.getOutputStream());
                    resultOut.writeObject(result);
                }
                client.close();
                serverSocket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

  • 写回答

4条回答 默认 最新

  • Winson.J 2021-10-27 14:00
    关注

    16行,创建服务的代码放到循环外面,不要每次都重建服务。
    27行,代码删掉,服务不要关
    不一定能解决问题,是代码要这样写才合理

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

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同