TCP中使用ObjectOutputStream传输数据对象抛出**Connection reset**的异常。

特别注意:
在使用ObjectOutputStream基于TCP传输时客户端在发送完ObjectOutputStream oos = new ObjectOutputStream(ops);
oos.writeObject(p);一定要记得调用
oos.flush();
socket.shutdownOutput();flush()是为了刷新缓冲区,socket.shutdownOutput()用来关闭Socket的输出流。通知服务器端自己已经发送完了否则在服务器端调用`ObjectInputStream ois = new ObjectInputStream(s.getInputStream());抛出Connection reset的异常。因为在没有调用shutdownOutput()时,服务器端收到流后并不知道何时客户端发完消息,就会立刻关闭socket,就会造成服务器已经关闭Socket,但是客户端依旧在发送数据,服务器就会抛出异常了。

服务器端代码:

public static void main(String[] args) throws IOException, ClassNotFoundException {

        serverSoctetTell s = new serverSoctetTell();
         s.GetAndSendPerson();
    }

    public void GetAndSendPerson() throws IOException, ClassNotFoundException {
        ServerSocket socket = new ServerSocket(8899);
        System.out.println("服务器端已启动,准备接收数据对象*****");
        Socket s = socket.accept();
        if (!s.isClosed()) {
            ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
            Person pul = (Person) ois.readObject();
            System.out.println(pul.toString());
            socket.close();
        } else {
            System.out.println("服务器已经关闭");
        }
    }

客户端代码

public static void main(String[] args) {
        clientSocketTell cst = new clientSocketTell();
        Person p = new Person("吴俊杰", "123456");
         try {
         cst.GetAndSendPerson(p);
         } catch (ClassNotFoundException | IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
         }
    }

    public void GetAndSendPerson(Person p) throws IOException, ClassNotFoundException {
        InetAddress address = InetAddress.getByName("127.0.0.1");
        Socket socket = new Socket(address, 8899);
        System.out.println("客户端准备发送数据:" + p.toString());
        OutputStream ops = socket.getOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(ops);
        oos.writeObject(p);
        oos.flush();
        socket.shutdownOutput();
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值