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

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 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题