服务端与客户端传对象以及 I/O 流顺序问题

1 篇文章 0 订阅
1 篇文章 0 订阅

创建要传输的实体对象UserInfo:

package com.NIO.socket;

import java.io.Serializable;

public class UserInfo implements Serializable {
    private long id;
    private String userName;
    private String password;

    public UserInfo(){}

    public UserInfo(long id,String userName,String password){
        super();
        this.id = id;
        this.userName=userName;
        this.password=password;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

服务端示例代码如下:

public class ObjectServer {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = serverSocket.accept();
        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream();
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        for(int i =0;i<5;i++){
            UserInfo userInfo = (UserInfo) objectInputStream.readObject();
            System.out.println("在服务器端打印:"+userInfo.getId()+":"+userInfo.getUserName()+":"+userInfo.getPassword());

            UserInfo newUserInfo = new UserInfo();
            newUserInfo.setId(i+1);
            newUserInfo.setUserName("serverUsername"+i);
            newUserInfo.setPassword("serverPassword"+i);
            objectOutputStream.writeObject(newUserInfo);
        }
        objectOutputStream.close();
        objectInputStream.close();

        outputStream.close();
        inputStream.close();

        socket.close();
        serverSocket.close();
    }
}

客户端示例代码如下:

public class ObjectClient  {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Socket socket = new Socket("localhost",8888);
        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);

        for(int i=0;i<5;i++){
            UserInfo userInfo = new UserInfo();
            userInfo.setId(i+1);
            userInfo.setUserName("clientUsername"+i);
            userInfo.setPassword("clientPassname"+i);
            objectOutputStream.writeObject(userInfo);
            UserInfo newUserinfo = (UserInfo) objectInputStream.readObject();
            System.out.println("在客户端打印:"+newUserinfo.getId()+":"+newUserinfo.getUserName()+":"+newUserinfo.getPassword());
        }
        objectOutputStream.close();
        objectInputStream.close();

        outputStream.close();
        inputStream.close();

        socket.close();
    }
}

运行服务器端和客户端结果服务器输出结果如下:

在服务器端打印:1:clientUsername0:clientPassname0
在服务器端打印:2:clientUsername1:clientPassname1
在服务器端打印:3:clientUsername2:clientPassname2
在服务器端打印:4:clientUsername3:clientPassname3
在服务器端打印:5:clientUsername4:clientPassname4

客户端输出结果如下:

在客户端打印:1:serverUsername0:serverPassword0
在客户端打印:2:serverUsername1:serverPassword1
在客户端打印:3:serverUsername2:serverPassword2
在客户端打印:4:serverUsername3:serverPassword3
在客户端打印:5:serverUsername4:serverPassword4

控制台输出的结果证明服务端和客户端传输Userinfo对象成功,但在这里需要注意的是,如果在服务端使用程序代码:

        ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = serverSocket.accept();
        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream();
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);

那么先获得 ObjectlnputStream 对象,然后获得 bjectOutputStream 对象。如果客户端 也使用同样顺序的代码:

        Socket socket = new Socket("localhost",8888);
        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream();
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
       

那么 客户端也是先获得 Obj ectlnputStream 象,然后获得 b j ectOutpu tS tr earn 这样的话,在运行程序时,会在服务端的程序代码:

 ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);

出现阻塞的现象。正确的写法应该是

1 )服务端先获得 bjectlnputStream 客户端就要先获得 bjectOutputStream 对象

2)服务端先获得 Obj ectOutputS earn 对象,客户端就要先获得 ObjectinputStream 象。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值